【发布时间】:2021-08-28 15:43:17
【问题描述】:
我有多个下拉搜索过滤器。只要我选择每个下拉列表,我就可以过滤表的所有列。如果我只选择其中一个或两个,它不会返回任何结果。有什么要补充的还是我做错了?
口才
$query = Table::when($id, function($q) use ($id){
return $q->where('id', $id);
})
->when($state, function($q) use ($state){
return $q->where('state', $state);
})
->when($country, function($q) use ($country){
return $q->where('country', $country);
})
->when($name, function($q) use ($name){
return $q->where('name', $name);
})
->when($city, function($q) use ($city){
return $q->where('city', $city);
})
->when($status, function($q) use ($status){
return $q->where('status', $status);
})
->paginate(10);
return $query;
控制器
if ($request->id || $request->state || $request->country|| $request->name || $request->city || $request->name || $request->status){
$filter = $eloquent->getTable($request->id, $request->state, //all request);
}
else{
$filter = $eloquent->all();
}
或者还有其他方法可以做到吗?指导和帮助将不胜感激。
【问题讨论】:
-
无法发现查询本身有任何问题。有时当像这样卡住时,分析生成的 sql 查询以查看它是否真的产生了我想要的帮助我。有时我倾向于在 mysql/db admin 中运行该 sql 以查看它是否真的获取数据。您可以使用
toSql()而不是paginate来查看查询。 -
我认为当你说“如果我只选择其中一个或两个,它不会返回任何结果”,这意味着这两个字段之一是“id” (我只是假设)。因此,在这种情况下,您可能已经过滤了“id”和另一个字段,它们什么都不返回。尝试选择除“id”之外的任何 2 列,然后您可以获得一些东西。所以我认为问题在于您正在过滤“id”。这有意义吗??
-
@boolfalse 实际上 id 字段是搜索字段,而其他字段是下拉字段
-
无论如何,请尝试逐步构建您的查询。尝试仅使用 1 个字段,然后是 2,然后是 3,等等。这样您就可以找到问题所在。 (别忘了有时清空缓存)
-
@boolfalse 只是使用了前两个 when 子句。可以单独过滤第二个 when 子句和 both 子句。第一个什么都不返回。