我正在尝试建立一个多态一对一的关系(has_one和belongs_to的多态等价物)。我有一个Address
模型,还有其他几个我希望拥有的模型一个地址。但是,我对文档的措辞感到困惑。我见过morphMany
方法,但我的问题是:我应该使用morphMany
,即使我只希望它有一个地址,或者有类似morphOne
方法的东西我应该正在使用?
编辑:我的Address
模型包含这些字段,只是为了帮助可视化:
Schema::create('addresses', function ($table)
{
$table->increments('id');
$table->string('street');
$table->string('street_more')->nullable();
$table->string('city');
$table->string('state')->nullable();
$table->string('country');
$table->string('postal_code');
$table->integer('addressable_id');
$table->string('addressable_type');
});
答案 0 :(得分:24)
是的,有一个 morphOne 方法,我认为在这种情况下你应该使用它:https://github.com/laravel/framework/blob/5.2/src/Illuminate/Database/Eloquent/Model.php#L811。
您也可以使用
$table->morphs('addressable');
而不是
$table->integer('addressable_id');
$table->string('addressable_type');
我在L4的自定义包中使用了morphOne,效果非常好。
答案 1 :(得分:3)
尝试这个,我认为这比不支持的morphOne更好。
public function address()
{
return $this->hasOne('App\Address', 'addressable_id','id')
->where('addressable_type', 'App\Model');
}