Laravel 5.4 - Стремление загружать ребенка и внука с помощью Выбрать оба

Я пытаюсь загрузить две глубокие отношения (ребенок и внук) с выборами на обоих потомков. Тем не менее, когда я добавляю addSelect() метод внуку возвращает пустой массив. У меня есть следующее:

$products = Category::with([
   'products' => function($q){ $q->addSelect(['product_name', 'product_desc']);},
   'products.productgroup' => function($q){ $q->addSelect(['price']);}
])->where('id', 1)->get();

Это возвращает категорию и ограничения продукта, но группа продуктов возвращается как пустой массив.

Если я запускаю следующее:

$products = Category::with('products', 'products.productgroup')->where('id', 1)->get();

Я получаю ожидаемый возврат всех данных, включая данные группы продуктов. Это только когда я добавляю addSelect() метод для products или products.productgroup, который возвращает пустой массив. Есть что-то, чего я здесь не хватает?

Я не могу найти подобные проблемы в стеке или на форумах Laravel, и я в тупике.

РЕДАКТИРОВАТЬ: Включая запрос от панели отладки

Запросы, появившиеся на панели отладки:

30.55ms
select * from `categories` where `id` = '1'
29.38ms
homestead
select `product_name`, `category_product`.`category_id` as`pivot_category_id`, `category_product`.`product_id` as `pivot_product_id` from `products` inner join `category_product` on `products`.`id` = `category_product`.`product_id` where `category_product`.`category_id` in ('1')
730μs
homestead
select `price` from `product_groups` where `product_groups`.`product_id` in ('')

Я не 100% о том, как построитель запросов работает под капотом с энергичной загрузкой. Может показаться, что идентификатор продукта не передается в запрос product_groups, когда addSelect() присутствует либо в запросе продукта, либо в запросе группы продуктов.

3 ответа

Итак, ответ на этот вопрос довольно прост. При выборе столбцов у ребенка и внука используется addSelect()Я не выбирал product.id или же productgroup.product_id, product.id а также productgroup.product_id очевидно необходимы для сопоставления внука с дочерним узлом. Так должно быть:

$products = Category::with(['products' => function($q){
    $q->with(['productgroups' => function($g){
        $g->addSelect(['id', 'price', 'product_id']);
    }])->addSelect(['id', 'product_name', 'product_desc']);
}])->where('id', 1)->get();

Надеюсь, что это поможет любому, кто столкнется с узлом внука нетерпеливой нагрузки, возвращающей пустой массив.

ХТ Эдди Голубь

Я использовал его вложенное форматирование, которое воспроизводило ту же проблему, но было синтаксически чище, чем я сам.

Попробуй вот так

$products = Category::with(['products' => function($q){ 
    $q->with(['productgroup' => function($a) {
        $a->addSelect(['price']);
    }])->addSelect(['product_name', 'product_desc']);
})->where('id', 1)->get();

Попробуйте это, если это работает, плз:

$product_ids = Category::find(1)->products()->pluck('id');
$prices = ProductGroup::whereIn('product_id', $product_ids)->pluck('price');
Другие вопросы по тегам