假设我有两个模型:Park
和Items
。每个Park
可以有多个Items
,通过HasMany
关系。
在Items
表格中有一个park_id
字段和一个type
标记:Item
可以是喷泉,或篮球场,或其他什么。
我需要做的是过滤公园,只获得那些拥有数组中传递的所有项类型的人。这就是我所拥有的:
$parks = Park::whereHas('items', function($q) use ($request) {
$q->where('type', json_decode($request->type_list));
})->get();
但它不能正常工作。有什么想法吗?
非常感谢,祝大家新年快乐!
编辑:我发现了一个非常难看的解决方案:
$types_array = json_decode($request->type_list, true);
$results = [];
// A collection of parks for each item type
foreach($types_array as $type) {
$results[] = Park::whereHas('items', function($q) use ($type) {
$q->where('type', $type);
})->get();
}
// Intersect all collections
$parks = $results[0];
array_shift($results);
foreach ($results as $collection) {
$parks = $collection->intersect($parks);
}
return $parks;
答案 0 :(得分:1)
您可以在whereHas方法中使用foreach。它应该是这样的:
$array = json_decode($request->type_list, true)
$parks = Park::whereHas('items', function($q) use ($array) {
foreach ($array as $key => $type) {
$q->where('type', $type);
}
})->get();
答案 1 :(得分:0)
我认为使用where子句匹配同一行的所有项目类型将不会产生任何结果,这就像执行where id = 1 and id = 2
一样,这是不可能的,因为id只能使用一个值,你应该做的是使用{{ 1}}获取至少匹配一种类型的所有项目,然后使用whereIn
按groupBy
对结果进行分组,然后在having子句中检查组计数是否等于park_id
数:
type_list
答案 2 :(得分:0)
您可以向一个查询添加多个whereHas()
约束:
$types_array = json_decode($request->type_list, true);
$query = Park::query();
foreach($types_array as $type) {
$query->whereHas('items', function($q) use($type) {
$q->where('type', $type);
});
}
$parks = $query->get();