我正试图利用多态关系来解决suppliers
和products
之间的多对多关系:
products
id
name
suppliers
id
name
product_supplier
id
product_id // belongsToMany easily takes care of this id
supplier_id // and this id
price // this can be fetched using withPivot('price')
deliverymethod_id // I'm having difficulties "joining" this one.
我对使用belongsToMany()
充满信心,我可以轻松做到这样的事情:
public function products()
{
return $this
->belongsToMany('Supplier')
->withPivot('price');
}
但是这里的问题是加入关系表中的第三列:
deliverymethods
id
name
我不确定如何做到这一点。我被告知多态关系就是我所追求的,但我不确定如何根据我的情况实施它们。
http://laravel.com/docs/4.2/eloquent#many-to-many-polymorphic-relations
根据文档,我必须重命名我的表格列以包含*able_id
和*able_type
。这真令人困惑。
我期待像belongsToMany('Supplier')->withAlso('Deliverymethod')
答案 0 :(得分:2)
我担心这种方法不存在(但是?)。
我要回归的是手动填写第三种关系:
public function products()
{
return $this
->belongsToMany('Supplier')
->withPivot('price', 'delivermethod_id');
}
现在,我可以通过->pivot->deliverymethod_id
访问每Product
个Supplier
。
您甚至可以在Product
模型中添加一个自动填充此功能的功能:
Class Product ... {
protected $appends = array('deliverymethod');
public function getDeliverymethodAttribute()
{
return Deliverymethod::find($this->pivot->delivermethod_id);
}
现在,每当您通过与供应商的关系请求产品时,自动包含deliverymethod
属性,其中包含对象。
(要在直接获得Product
时不要抛出错误,只需从$appends
模型中删除Product
变量,然后每次手动调用getDeliverymethodAttribute()
方法你需要它。)
多态关系用于关系,其中两个模型同时与第三个模型相关。例如,User
和Product
都可以包含Picture
个UserPicture
。现在,为图片(ProductPicture
和Picture
)设置两个模型是没有意义的,因为它们都具有相同的特征。这是使用多态关系的完美理由,User
可以属于Product
或 a Deliverymethod
。
但是,在您的情况下,Supplier
会将直接应用于Product
和{{1}}之间的关系。所以这不是多态关系可行的地方,而是以你的方式完成它。