我正试图在两个后代身上都选择一个两个深层次的关系(孩子和孙子)。但是,当我向孙子添加addSelect()
方法时,它返回一个空数组。我所拥有的是:
$products = Category::with([
'products' => function($q){ $q->addSelect(['product_name', 'product_desc']);},
'products.productgroup' => function($q){ $q->addSelect(['price']);}
])->where('id', 1)->get();
这将返回类别和产品约束,但productgroup将作为空数组返回。
如果我运行以下代码:
$products = Category::with('products', 'products.productgroup')->where('id', 1)->get();
我得到所有数据的预期回报,包括productgroup数据。只有当我将addSelect()
方法添加到产品或产品时,才会出现这种情况。productgroup,它返回一个空数组。这里有我遗漏的东西吗?
我在stack或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%了解查询生成器如何在急切加载的情况下工作。当产品查询或productgroup查询上存在addSelect()
时,产品ID似乎没有传递到product_groups查询。
好的,答案很简单。使用addSelect()
从子项和孙项中选择列时,我没有选择产品。id
或产品组。产品标识
。产品。id
和产品组。要将孙子节点映射到子节点,显然需要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');