Laravel eager loading在查询关系时返回所有结果

时间:2014-03-09 13:41:31

标签: laravel laravel-4 eloquent

我想获得一个包含一个特定单词的系列名称的产品。但它会返回所有产品。匹配的系列名称条件似乎是每个相关产品下的数组;对于其他产品,它只是一个空白的“系列”键。

$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”的产品。 我做错了什么? 感谢

2 个答案:

答案 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列表。