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');