Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
Здравствуйте.
Сразу покажу структуру таблиц
Cart - id - user_id - code ... Product - id - name ... CartProduct - id - cart_id - product_id - product_variation_id // ->withPivot('product_variation_id'); - quantity ProductVariation - id - prouct_id - price ... ProductVariationCombination // связная таблица между ProductVariation и Attribute - id - variation_id - attribute_id
Хочу отобразить товары которые в корзине. Делаю запрос:
$cart = $this->cart->with('products')->where('user_id', auth()->id())->first();
Окей, так все четко возвращается корзина с товарами. Но,я хочу вывести под товаром еще его цвет и размер если таковые присутствуют. Так вот, этот цвет и размер относятся к варианту, а ид варианта уже в пивотной таблице. Сам вопрос, как получить этот ид варианта из пивотной таблице прямо в запросе? Тоесть примерно так:
$cart = $this->cart->with(['products' => function($q){
$q->whereHas('variations', function($q) {
$q->where('id', /*Тут надо как то этот ид вытащить который находится в пивотной таблице */);
});
}])->where('user_id', auth()->id())->first();
Изменено Testuser123 (10.10.2017 14:28:23)
Не в сети
Тебе нужно отфильтровать по вариантам или подгрузить варианты? Ты говоришь, что нужно показать информацию в вариантах, но используешь whereHas. И еще, ты Variation не показал.
Изменено AlexeyMezenin (10.10.2017 13:53:50)
Не в сети
Не в сети
Я вижу здесь два варианта:
1. Можно загрузить продукты и пройтись по данным, собрав ID product_variation_id. Потом использовать собранные ID, чтобы загрузить ProductVariation и Attribute. Затем уже работать с двумя загруженными коллекциями. Способ не очень элегантный, но это поможет избежать N+1.
2. Создать модель для pivot таблицы CartProduct (судя по всему, она у тебя уже создана). Добавить свзяи Cart hasMany CartProduct, CartProduct belongsTo Product и CartProduct belongsTo ProductVariation. Тогда можно будет загружать так:
$this->cart->where('user_id', auth()->id())
->with(['cartProducts', 'cartProducts.product', 'cartProducts.productVariation', 'cartProducts.productVariation.attributes'])
->find();
Если dot notation не работает с третьим уровнем связей, используй nested with для последней связи. В старых версиях только два уровня работали, в новых три работают (возможно не со всеми связями).
Не в сети
Не в сети
Страницы 1