【问题标题】:Laravel eager loading returns all results when querying realtionshipLaravel 急切加载在查询关系时返回所有结果
【发布时间】:2014-03-10 21:46:35
【问题描述】:

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

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

【问题讨论】:

    标签: laravel laravel-4 eloquent


    【解决方案1】:

    我认为不是使用 Model::with(),而是要根据相关模型过滤 Model,所以你应该使用 Model::whereHas()

    $products = Product::whereHas('serie', function($query)
    {
        $query->where('name','like','%unky%');  
    })->get()->toArray();
    

    【讨论】:

      【解决方案2】:

      预加载约束不会对模型的结果施加约束 - 它会约束相关模型。在您的情况下,您将获得所有产品。但是,如果您尝试访问产品的系列,您将只能获得符合您的条件的系列。

      如果您也需要访问系列并且不仅需要产品,我会这样查询:

      $products=Product::with(array(
        'serie'=>function($query)
        {
          $query->where('name','like','%unky%');  
        }))
        ->whereHas('serie', function($query) {
          $query->where('name','like','%unky%');  
        })
      ->get()->toArray();
      

      在这种情况下,您只会获得与名称类似 %unky% 的系列相关联的产品,并且您只会获得保持相同条件的相关系列。

      总结一下: whereHas 根据条件限制产品列表,而 Eager Loading 限制仅限制每个产品的系列列表。

      【讨论】:

        猜你喜欢
        • 2014-06-12
        • 2020-01-31
        • 2013-05-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-23
        • 2020-09-12
        相关资源
        最近更新 更多