Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 10.10.2017 12:55:23

Получить pivot значение в m2m связи

Здравствуйте.
Сразу покажу структуру таблиц

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

Хочу отобразить товары которые в корзине. Делаю запрос:

PHP
$cart $this->cart->with('products')->where('user_id'auth()->id())->first();

Окей, так все четко возвращается корзина с товарами. Но,я хочу вывести под товаром еще его цвет и размер если таковые присутствуют. Так вот, этот цвет и размер относятся к варианту, а ид варианта уже в пивотной таблице. Сам вопрос, как получить этот ид варианта из пивотной таблице прямо в запросе? Тоесть примерно так:

PHP
$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)

Не в сети

#2 10.10.2017 13:49:51

Re: Получить pivot значение в m2m связи

Тебе нужно отфильтровать по вариантам или подгрузить варианты? Ты говоришь, что нужно показать информацию в вариантах, но используешь whereHas. И еще, ты Variation не показал.

Изменено AlexeyMezenin (10.10.2017 13:53:50)

Не в сети

#3 10.10.2017 14:31:27

Re: Получить pivot значение в m2m связи

AlexeyMezenin, спасибо за ответ. Мне надо получить товары которые в корзине вместе с их атрибутами (Размер, цвет) через ProductVariation.
Обновил вопрос.

Изменено Testuser123 (10.10.2017 14:32:46)

Не в сети

#4 10.10.2017 16:04:16

Re: Получить pivot значение в m2m связи

Я вижу здесь два варианта:

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 для последней связи. В старых версиях только два уровня работали, в новых три работают (возможно не со всеми связями).

Не в сети

#5 12.10.2017 06:54:29

Re: Получить pivot значение в m2m связи

Спасибо! Попробую со вторым варриантом.

Не в сети

Подвал раздела