2014-05-07 67 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%肯定它正在工作。系统能够正确地将模板与其相关状态相关联。在修补程序中玩耍,现在看起来一切正如预期的那样工作。 –