laravel имеет много сквозных сводных таблиц

#laravel #laravel-5 #eloquent

#laravel #laravel-5 #красноречивый

Вопрос:

У меня есть 3 таблицы

     Products
    id, name, image
    Offers
    id,name
    Offer_product
    id,offer_id,product_id
  

Я получаю доступ к данным таблицы продуктов с разбиением на страницы, используя

 $list  = Product::query()->paginate(6);
  

теперь я хочу, чтобы полная запись продуктов с названием предложения сохранялась в таблице предложений. id как product, так и offers хранятся в таблице offer_product, где у одного продукта может быть много предложений

Комментарии:

1. пробовал через отношение, но я предполагаю, что мне следует использовать hasmanythrough сводную таблицу

2. Можем ли мы увидеть ваши определения взаимосвязей в вашем продукте и моделях предложений?

Ответ №1:

В вашем дизайне БД у вас есть отношение «Многие ко многим», которое в Laravel обрабатывается belongsToMany https://laravel.com/docs/5.7/eloquent-relationships#many-to-many.

hasManyThrough для каскадного случая «1 ко многим»> «1 ко многим». Допустим, у исполнителя много альбомов, и в каждом альбоме много песен, тогда у исполнителя много песен через альбомы. Если вам нужны песни исполнителя, то вы можете использовать напрямую hasManyThrough .

В вашем случае ваше отношение в Product.php модели должно быть :

 public function offers() {
    return $this->belongsToMany(Offer::class, 'Offer_product')->withPivot('id');
}
  

В Offer.php модели :

 public function products() {
    return $this->belongsToMany(Product::class, 'Offer_product')->withPivot('id');
}
  

Теперь, если вы хотите, чтобы все они загружались с нетерпениемhttps://laravel.com/docs/5.7/eloquent-relationships#eager-loading чтобы избежать N (продуктов) 1 вызовов к базе данных :

 $products = Product::with('offers')->get();
foreach ($products as $product) {
    echo 'product : '.$product->name.'<br/>';
    foreach($product->offers as $offer) {
        echo '<br>---- offer : '.$offer->name;
        // once you called the relation, then you can access data on pivot table
        echo ' - pivot id :'.$offer->pivot->id;
    }
}