我有以下查询:
$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();
我只能访问详细信息表属性。问题是:如何使用语句访问城市表属性以进行过滤?
预先感谢
答案 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集合进行过滤。