Laravel имеет много через сводный стол - PullRequest
1 голос
/ 27 марта 2019

у меня 3 стола

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

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

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

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

1 Ответ

1 голос
/ 27 марта 2019

В вашей структуре БД у вас есть отношение «многие ко многим», которое в 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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...