#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;
}
}