【问题标题】:Laravel search filtering cannot single filterLaravel 搜索过滤不能单过滤
【发布时间】: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 子句。第一个什么都不返回。

标签: laravel eloquent


【解决方案1】:

试试这个:

$query = Model::query();

if(isset($id))
 $query->where('id', $id);
if(isset($state))
 $query->where('state', $state);
if(isset($country))
 $query->where('country', $country);
if(isset($name))
 $query->where('name', $name);
if(isset($city))
 $query->where('city', $city);
if(isset($status))
 $query->where('status', $status);
return $query->paginate(10);
 

【讨论】:

  • 试试看,还是一样的结果。我刚刚更新了我的控制器,可能是它不起作用的原因。
  • @NewbieCoder 发送完整的控制器。我认为你的问题出在你的控制器上
【解决方案2】:

首先声明您的查询,然后您可以从下拉选择中的最低值爬上条件树;

$query = Table::when($status, function($q) use ($status){
            return $q->where('status', $status);
        });

if(isset($city)) {
    $query = $query->when($city, function($q) use ($city) {
                 return $q->where('city', $city);
             });
}

if(isset($name)) {
    $query = $query->when($name, function($q) use ($name) {
                 return $q->where('name', $name);
             });
}
// climb up the condition tree you want to check from least dependent variable to most dependent variable
...
...
// return filtered results
return $query->paginate(10);

【讨论】:

  • I got an error ''syntax error, unexpected ';', expecting ')''' 我认为};之前应该有一个括号我确实把括号和错误修复了,但结果还是一样。
  • 表单上哪些字段是必填字段?您可以省略几个条件,甚至根据您的需要创建一个新条件
  • 非必填项,用户可以选择任何过滤字段。要么全部,要么只有一两个
  • 检查来自 from 的输入值是否显示正常;先尝试一个选择,然后继续下一个选择;必须有办法;继续努力
  • 尝试不同的方法,似乎它仍然返回相同的结果。我只是编辑并添加我的控制器。可能是它不起作用的原因..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-05
  • 2019-12-21
  • 2019-09-02
  • 2021-06-06
  • 2020-04-26
相关资源
最近更新 更多