Laravel雄辩-使用语句过滤子查询

时间:2019-02-20 23:09:44

标签: php laravel eloquent

我有以下查询:

 $countries = Country::where('code', '=', $code)
 ->with(array('cities.details' => function ($query) use ($user) {
 $query->where('cities.name', '=', 'This is a city name');
 }))->first();

让我们看一下示例:我有三个表,国家城市城市详细信息。我想获得所有国家/地区,然后得到所有城市(包括详细信息),但是我还想按名称过滤城市获取属于城市表的详细信息表 e。

如果我想使用{来使用with(cities.details)来获得子表和另一个表,如何使用CITIES属性进行过滤?

主要问题是:如何使用secondTable.OtherTable之类的with语句获取两个表,并使用secondTable属性过滤查询?

为了更清楚一点,如果我使用如下语句:

  $countries = Country::where('code', '=', $code)
 ->with(array('cities.details' => function ($query) use ($user) {
    $query->where('name', '=', 'This is a detail name');
    }))->first();

我只能访问详细信息表属性。问题是:如何使用语句访问城市表属性以进行过滤?

预先感谢

2 个答案:

答案 0 :(得分:0)

我刚刚找到了解决方案。基本上,我应该为城市表应用过滤器,然后在子查询上调用wit函数。这段代码解决了我的问题:

catch

请注意,只有在子查询中进行过滤后,我才在城市调用 with('details')

答案 1 :(得分:0)

最直接的方法是使用联接查询:

(new Country)
    ->join('cities', 'cities.id', '=', 'countries.city_id')
    ->join('city_details', 'cities.id', '=', 'city_details.city_id')
    ->where('cities.name', 'TheName')
    ->where('city_details.info', 'info')
    ->select('...');

但是结果只有一个级别。因此,

$query = (new Models\Country())
    ->with([
        'cities' => function ($query) {
            $query->where('name', 'xxx')->with([
                'details' => function ($query) {
                    $query->where('info', 'info');
                }
            ]);
        }
    ]);

$result = $query->get()->filter(function ($item) {
    return count($item['cities']);
});

结果给出了城市为空的国家。因此,最后使用Laravel集合进行过滤。