Laravel по-русски
      
      
    Русское сообщество разработки на 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