Я пытаюсь разобраться, используя полиморфные отношения для отношений между многими 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
, Это действительно сбивает с толку.
Я ожидал, что Laravel будет что-то вроде belongsToMany('Supplier')->withAlso('Deliverymethod')
Я боюсь, что метод не существует (пока?).
Я возвращаюсь к ручному заполнению 3-го отношения:
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
,
Тем не менее, в вашем случае Deliverymethod
относится непосредственно к отношению между Supplier
а также Product
, Так что это не то место, где полиморфные отношения будут работать, но вместо этого это должно быть сделано так, как вы это сделали.
Других решений пока нет …