我需要根据可能的许多参数(如宗教、姓名、当前地址等(过滤移民列表,但数据存储在多个表中(例如宗教有自己的表(。我还想使用"with"函数来获得嵌套的json输出,如:
{
"id": 5,
"birthdate": "1996-08-13",
"person": {
"name": "Lorem",
"street": "Ipsum"
}
...
}
除此之外,我不知道确切的过滤器,因为它们包含在请求json中(列、运算符、值,如果需要的话可能还有表(,所以我不能对它们进行硬编码。
我目前正在对过滤器进行foreach,并尝试使用嵌套的whereHas,但没有成功。我尝试了构建器的联接功能,它起作用了,但json没有嵌套。
return Migrant::with('Person.Ort', ...(many other tables))->whereHas('Person', function($q) use($filter) {
foreach ($filter as $key => $value) {
$q->whereAnd($key, $value['operator'], $value['value']);
}
})->get();
这是有效的,但正如您所猜测的,只适用于涉及"Person"表的过滤器,而不适用于其他可能的表。
有可能用雄辩来做这样的事情吗?
编辑:为了澄清,我想做一个这样的查询:
SELECT * FROM Migrant INNER JOIN Persons ON Migrant.id = Persons.id INNER JOIN Countries ON Migrant.country = Countries.id INNER JOIN ... WHERE Persons.name = "Lorem" AND Countries.country = "Disneyland" AND ...
return Migrant::with([
'Person.table1'=>function($query) use($filter){
$query->where($filter['table1']['key'], $filter['table1']['operator'], $filter['table1']['value']);
},
'Person.table2'=>function($query) use($filter){
$query->where($filter['table2']['key'], $filter['table2']['operator'], $filter['table2']['value']);
}])->get();
更新:
$mainQuery = Migrant::with('Person.Ort', ...(many other tables));
if($filter['table1']){
$mainQuery = $mainQuery->whereHas('table1', function($q) use($filter) {
$q->whereAnd($filter['table1']['key'], $filter['table1']['operator'], $filter['table1']['value']);
})
}
.
.
return $mainQuery->get();
更新2:
$mainQuery = Migrant::with(['Person.Ort', 'Land', 'Herkunft', 'Staat', 'Erfasser', 'Konfession', 'Betreuer', 'Aufenthaltsstatus', 'Arbeitserlaubnis']);
foreach($filter as $table=>$value){
$mainQuery = $mainQuery->whereHas($table, function($q) use($value) {
$q->where($value['key'], $value['operator'], $value['value']);
})
}
return $mainQuery->get();