仅当hasMany关系具有元素时才获取对象列表

时间:2015-05-09 17:15:51

标签: php arrays laravel eloquent laravel-5

我有3张桌子

Shops    - id, place_id, name...
Products - id, shop_id, name ...
Product_Tag - product_id, tag_id ... (pivot table)
Tags - id....

我希望得到如下数组的结果:

array [
  0 => [
    "id" => 1,
    "name" => "Shop name",
    "products" => [...]
  ]
]

但我想通过place_id和标签名称进行搜索。像这样:

$shops = Shop::where('place_id', 1)
     ->with(array('products' => function($query)
     {
        $query->whereHas('tags', function ($query) {
            $query->where('slug', 'tagname1');
        });
     }))->get();

这没关系。但如果没有商店产品有这个标签,我仍然会得到带有空产品阵列的Shop对象。如果在那个商店,至少有一个产品有这个标签,一切都还可以。如果它有空产品清单,我不想去购物。此外,我认为要预先处理该数组并搜索空数组然后删除商店对象是一种开销。是否有更好的方法可以从数据库中取出?

1 个答案:

答案 0 :(得分:1)

您可以嵌套'has'语句。请参阅:http://laravel.com/docs/5.0/eloquent#querying-relations

所以这应该有效:

$shops = Shop::where('place_id', 1)->whereHas('products.tags', function ($query) {
    $query->where('slug', 'tagname1');
 })->with(products.tags)->get();