2014-10-17 85 views
1

我有一个结构2款这样的:错误创建子女关系

class Contenuti extends Eloquent { 
    public function dettaglio() 
    { 
     return $this->hasOne('ContenutiDettaglio', 'contenuto_id'); 
    } 
} 

class ContenutiDettaglio extends Eloquent { 
    public function contenuto() 
    { 
     return $this->belongsTo('Contenuti', 'contenuto_id', 'id'); 
    } 
}  

我试图创建一个Contenuti时延长Contenuti的findOrNew总是添加ContenutiDettaglio项目。

,我写我的分机是这样的:

public static function findOrNew($id, $coloumns = array()) 
{ 
    $obj = parent::findOrNew($id); 

    if(!isset($obj->dettaglio()->id)) 
    { 
     $obj->save(); 

     $dettaglio = ContenutiDettaglio::create(array('titolo' => 'Nuovo contenuto')); 
     $dettaglio->contenuto()->associate($obj); 

     $obj = Contenuti::findOrFail($obj->id); 

     dd($obj->dettaglio()); 
    } 

    return $obj; 
} 

在数据库中ContenutiDettaglio记录包含父ID正常,但是当我倾倒$ obj-> dettaglio()其空。难道我做错了什么?

编辑:

这里是我的迁移:

#Contenuti 
public function up() 
{ 
    Schema::create('contenuti', function($t) { 
      $t->engine = 'MyISAM'; 

      // vecchia tabella "contenuti"  
      $t->increments('id'); 
      $t->bigInteger('userid')->nullable(); 
      $t->boolean('pubblica'); 

      // vecchia tabella "contenuti_it" 
      $t->timestamp('pubblica_dal')->nullable(); 
      $t->timestamp('pubblica_al')->nullable(); 

      $t->timestamps(); 

      $t->index('pubblica_dal'); 
      $t->index('pubblica_al'); 
      $t->index('created_at'); 
      $t->index('updated_at'); 
    }); 
} 

#ContenutiDettaglio 
public function up() 
{ 
    Schema::create('contenuti_dettaglio', function(Blueprint $table) 
    { 
     $table->engine = 'MyISAM'; 

     $table->increments('id'); 
     $table->integer('contenuto_id'); 
     $table->string('keywords', 255); 
     $table->string('titolo', 255); 
     $table->text('sottotitolo'); 
     $table->text('occhiello'); 
     $table->text('riassunto'); 
     $table->text('descrizione'); 

     $table->index('contenuto_id'); 
     $table->index('titolo'); 
    }); 
} 

凡contenuto_id在contenuti_dettaglio是2个表之间的键。

回答

1

首先,这里的口才上关系的文档:http://laravel.com/docs/4.2/eloquent#relationships

所以,对于hasOne的基本语法是这样的:

return $this->hasOne('ClassName', 'foreign_key', 'local_key'); 

其中,在默认情况下,foreign_keylocal_key等于 '身份证' 。 foreign_key是关系的主要关键。

对于属于关联是:

return $this->belongsTo('ClassName', 'local_key', 'foreign_key'); 

其中,在默认情况下,local_keyforeign_key再次等于 '身份证'。 Contenuti模型中儿童的钥匙由hasOne方法的foreign_key定义。我不知道你的确切DB模式,但我想你可以通过改变解决这个问题:

return $this->belongsTo('Contenuti', 'contenuto_id', 'id'); 

return $this->belongsTo('Contenuti', 'id', 'contenuto_id'); 

让我知道是否奏效,如果没有,追加迁移文件为那些桌子。

+0

感谢hannesvdvreken您的回应,我已经尝试过您的解决方案,但没有成功。我已经发布了我的迁移... – 2014-10-17 12:00:08

+0

我已经解决了我的问题,在这样 '公共静态函数findOrNew($ ID,$ coloumns =阵列()){ $ OBJ =父:: findOrNew($ ID); 如果($ obj-> ID == NULL){ \t $ obj->保存(); \t $详细=新ContenutiDettaglio(阵列( '标题'=> '新内容', 'contenuto_id'=> $ obj-> ID)); \t $ detail->保存(); \t未设置($ OBJ); \t $ OBJ =自我::发现($ detail-> contenuto_id); }返回$ OBJ; – 2014-10-17 14:54:11

+0

}'那不是真的建议,但它是否适合你,你不烦......然后,我为你感到高兴:-) – hannesvdvreken 2014-10-18 15:34:06