Laravel中这种多对多关系是否可行?

时间:2014-12-06 09:46:26

标签: php laravel many-to-many polymorphic-associations

我正试图利用多态关系来解决suppliersproducts之间的多对多关系:

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')

之类的东西

1 个答案:

答案 0 :(得分:2)

我担心这种方法不存在(但是?)。

我要回归的是手动填写第三种关系:

public function products()
{
    return $this
    ->belongsToMany('Supplier')
    ->withPivot('price', 'delivermethod_id');
}

现在,我可以通过->pivot->deliverymethod_id访问每ProductSupplier

您甚至可以在Product模型中添加一个自动填充此功能的功能:

Class Product ... {

protected $appends = array('deliverymethod');

public function getDeliverymethodAttribute()
{
    return Deliverymethod::find($this->pivot->delivermethod_id);
}

现在,每当您通过与供应商的关系请求产品时,自动包含deliverymethod属性,其中包含对象。

(要在直接获得Product时不要抛出错误,只需从$appends模型中删除Product变量,然后每次手动调用getDeliverymethodAttribute()方法你需要它。)

关于多态关系的简短说明:

多态关系用于关系,其中两个模型同时与第三个模型相关。例如,UserProduct都可以包含PictureUserPicture。现在,为图片(ProductPicturePicture)设置两个模型是没有意义的,因为它们都具有相同的特征。这是使用多态关系的完美理由,User可以属于Product a Deliverymethod

但是,在您的情况下,Supplier会将直接应用于Product和{{1}}之间的关系。所以这不是多态关系可行的地方,而是以你的方式完成它。