2014-10-17 89 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