Laravel 5.4 - 渴望加载Child和Grand with Select Both

时间:2017-03-02 14:35:27

标签: php laravel eager-loading 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();

这将返回Category和产品约束,但productgroup将作为空数组返回。

如果我运行以下内容:

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

我得到包括产品组数据在内的所有数据的预期回报。只有当我将addSelect()方法添加到产品或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%关于查询构建器如何在急切加载的情况下工作。当产品查询或产品组查询中出现addSelect()时,似乎产品ID未传递给product_groups查询。

3 个答案:

答案 0 :(得分:3)

好的,所以答案很简单。使用addSelect()从子孙中选择列时,我没有选择product.idproductgroup.product_id。显然需要product.idproductgroup.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();

希望这可以帮助遇到热门负载的孙子节点的其他任何人返回一个空数组。

HT to Eddy The Dove

我使用了他的嵌套格式来重现同样的问题,但语法清晰度比我自己的方式更清晰。

答案 1 :(得分:1)

试试这个

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

答案 2 :(得分:0)

如果它有效,请尝试使用plz:

$product_ids = Category::find(1)->products()->pluck('id');
$prices = ProductGroup::whereIn('product_id', $product_ids)->pluck('price');