Laravel 5.4 - 渴望加载儿童和孙子与选择两者

问题描述:

我试图加载两个深深的关系(儿童和孙子)与两个后裔的选择。但是,当我向孙子添加addSelect()方法时,它将返回一个空数组。我有以下内容:Laravel 5.4 - 渴望加载儿童和孙子与选择两者

$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(); 

我得到的所有数据,包括productgroup数据的预期收益。只有当我将addSelect()方法添加到产品或products.productgroup时,它才会返回一个空数组。有什么我在这里失踪?

我在堆栈或laravel论坛上找不到任何类似的问题,我很难过。

编辑:从debugbar

包括查询,在debugbar过来的查询是:

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查询。

+0

请你发布生成的查询吗? – dparoli

+0

查询的结果? –

+0

SQL查询,您可以使用laravel-debugbar查看在页面上运行的所有查询。 – dparoli

尝试这样

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

没有产生相同的结果。 –

+0

鉴于你的问题,我将发布相同的@EddyTheDove代码。你期望什么结果? – dparoli

+0

我期望产品组返回数据(价格)。它返回一个空数组。 –

试试这个,如果它工作PLZ:

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

我觉得这里有点混乱。我试图急切地加载一个类别实例的孩子和孙子,并将儿童和孙子的约束作为单个集合加载。 –

+0

对不起比尔,可能我是个笨蛋,但是我在你的代码中看到的唯一约束就是类别id的位置。 – dparoli

+0

不,你不笨。我是。我指的是'addSelect()'方法作为一个约束,因为这就是你要在一个有急切加载的子节点上添加一个约束(比如'$ q-> where('foo',$ bar)')的地方。当然,选择不是一个限制。这不会改变将addSelect()添加到子级或子级会在子级上返回空数组这一事实。 –

确定,所以这个问题的答案是非常简单的。当使用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涡鸽子

我用自己的这再现了同样的问题嵌套的格式,但语法比我自己的方式清洁。

+1

很好,你自己找到答案 – dparoli

+0

嘿,好像你用我的解决方案来解决你的问题。只是添加了更多的列。请将来与其他人的答案保持一致。您可以注册,将其标记为答案,或者至少提到您使用某个代码来获得解决方案。互相帮助并获得奖励的堆栈溢出工作。如果没有奖励,相信我,大多数人都不会回答。 – EddyTheDove

+0

您的“解决方案”没有解决问题。你只是以不同的方式重写了我已经完成的工作。这不是一个解决方案,它并没有解决问题。它返回了完全相同的问题(一个空数组)。如果你的答案以任何方式有助于解决问题,我会高兴地给予信贷。解决方案是请求产品组的外键(product_id)和'addSelect()'方法中产品的PK(id)。你的答案中没有这个。堆栈溢出的作用是获得解决问题的功劳,而不是以另一种方式重写OP的代码。 –