2014-05-07 65 views
1

我有兩種模型,即通過一對一關係關聯的模板和狀態。國家所屬的模板,Laravel一對一關係不相關

一個外鍵使用以下遷移創建:

public function up() 
{ 
    Schema::table(
     'templates', 
     function (Blueprint $table) { 
      $table->dropColumn('state'); 

      $table->integer('state_id')->unsigned()->index()->nullable(); 
      $table->foreign('state_id')->references('id')->on('template_states'); 
     } 
    ); 
} 

然後,模板模型類狀態字段定義爲一個hasOne關係:

public function state() 
{ 
    return $this->hasOne('TemplateState', 'id', 'state_id'); 
} 

而TemplateState模型類定義的逆位屬於:

public function template() 
{ 
    return $this->belongsTo('Template'); 
} 

我很難將狀態與在DB中創建的模板關聯起來。看看下面的修補匠:

[1] > $t = Template::find(1); 
// object(Template)(
// 'incrementing' => true, 
// 'timestamps' => true, 
// 'exists' => true 
//) 
[2] > $t->alias; 
// 'travel_journal' 
[3] > $s = TemplateState::find(1); 
// object(TemplateState)(
// 'incrementing' => true, 
// 'timestamps' => true, 
// 'exists' => true 
//) 
[4] > $s->state; 
// 'pending' 
[5] > $t->state()->save($s); 
// object(TemplateState)(
// 'incrementing' => true, 
// 'timestamps' => true, 
// 'exists' => true 
//) 
[6] > $t->state->state; 

在步驟[6]鼓搗,調用$ T->國有>狀態,我可以看到有沒有與這兩個模型方面的關聯,並期待在數據庫,模板的state_id仍然爲空。

我無法弄清楚我做錯了什麼,任何人都可以請幫忙!

回答

0

你的關係是錯誤的,這是你所需要的:

// Template model 
public function state() 
{ 
    return $this->belongsTo('TemplateState', 'state_id'); 
} 

// TemplateState model 
public function template() 
{ 
    return $this->hasOne('Template', 'state_id'); 
} 
+0

我在理解你在說我應該讓Template屬於TemplateState,所以反過來我現在有什麼? –

+0

是的,'hasOne' /'hasMany'需要另一個表上的外鍵,與'belongsTo'相對。 –

1

我已經成功地得到它的工作通過更改以下:

狀態模型:

public function template() 
{ 
    return $this->belongsTo('Template'); 
} 

模板型號:

public function state() 
{ 
    return $this->hasOne('TemplateState'); 
} 

並將外鍵添加到TemplateState模型中。現在

,要求是這樣的:

$template->state()->save($state); 

工作正常。

+0

確保它確實如您所願 –

+0

謝謝@deczo。我100%肯定它正在工作。系統能夠正確地將模板與其相關狀態相關聯。在修補程序中玩耍,現在看起來一切正如預期的那樣工作。 –