我想获得一个包含一个特定单词的系列名称的产品。但它会返回所有产品。匹配的系列名称条件似乎是每个相关产品下的数组;对于其他产品,它只是一个空白的“系列”键。
$products=Product::with(array(
'serie'=>function($query)
{
$query->where('name','like','%unky%');
}))
->get()->toArray();
返回的数组就像
[0] => Array
(
[id] => 1
[updated_at] => 2014-02-14 22:26:04
[created_at] => 0000-00-00 00:00:00
[brand_id] => 1
[cat_id] => 1
[serie_id] => 1
[devices_ids] => 1
[color_code] => #BEB991
[barcode] => 8699131462430
[title] => Funky Charlie iPhone 5/5S Kılıfı
[desc] => Sert 6 gr
[price] => 29.90
[serie] => Array
(
[id] => 1
[updated_at] => 2014-02-14 22:18:31
[created_at] => 0000-00-00 00:00:00
[name] => Funky
)
)
[1] => Array
(........
[5] => Array
(
[id] => 6
[updated_at] => 2014-02-14 22:46:10
[created_at] => 0000-00-00 00:00:00
[brand_id] => 1
[cat_id] => 1
[serie_id] => 2
[devices_ids] => 1
[color_code] => red
[barcode] => 8699131462546
[title] => Bonjour Kırmızı iPhone 5/5S Kılıfı
[desc] => Sert 6 gr
[price] => 24.90
[serie] =>
正如您所见,系列键是空的。 我想要的只是带来具有匹配系列名称的产品,而不是带有id为“5”的产品。 我做错了什么? 感谢
答案 0 :(得分:2)
我认为不是使用Model :: with(),而是根据相关模型过滤模型,所以你应该使用Model :: whereHas()
$products = Product::whereHas('serie', function($query)
{
$query->where('name','like','%unky%');
})->get()->toArray();
答案 1 :(得分:1)
急切加载约束不会对模型的结果施加约束 - 它限制了相关模型。在您的情况下,您获得所有产品。但是,如果您尝试访问产品系列,您将只获得符合您条件的系列。
如果您还需要访问该系列并且不仅需要产品,我会像这样进行查询:
$products=Product::with(array(
'serie'=>function($query)
{
$query->where('name','like','%unky%');
}))
->whereHas('serie', function($query) {
$query->where('name','like','%unky%');
})
->get()->toArray();
在这种情况下,您只获得链接到名称为%unky%的Serie的产品,并且您只获得保持相同条件的相关系列。
要总结:whereHas根据条件限制产品列表,而Eager Loading约束仅限制每个产品的Series列表。