仅在Hasmany关系具有元素时才获得对象列表



我有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和tag名称搜索。这样的东西:

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

这还可以。但是,如果没有任何商店产品具有该标签,我仍然会用空产品阵列获得商店对象。如果在那家商店里,一切都可以,至少一个产品具有该标签。如果有空产品清单,我不想获得商店。我也认为,要使用该数组并搜索空数组,然后删除商店对象,这是开销。是否有更好的方法可以完全不从数据库获取?

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

所以这应该有效:

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