【问题标题】:Laravel dynamic where clausesLaravel 动态 where 子句
【发布时间】:2016-12-28 18:44:16
【问题描述】:

我想用 laravel ORM 创建一个动态查询。在我的例子中:

 $query = Task::orderBy('customer_family_name');

 if (array_key_exists('date', $request->filter)) {
     if($request->filter['date'] != null) {
        $query = $query->whereDate(....);
     }
 }

 ..... more filters


 if (array_key_exists('search', $request->filter)) {
       if(strlen($request->filter['search']) > 1) {
            $searchText = $request->filter['search'];
            $query = $query->where('customer_family_name', $searchText.'%');
            }
        }
 }

 $Tasks = $query->get();

但它没有按预期工作。我认为 laravel 将推送所有 where 元素,因此必须满足所有 where 子句。

但无法搜索姓氏。我有什么问题吗?我怎样才能正确结合它?有没有办法用 orm 显示 SQL 查询?

编辑:好的,发现这是另一个问题,我的查询看起来像:

"select * from [tasks] where [state_id] in (?, ?, ?, ?, ?, ?) and [customer_family_name] = ? and [regulator_user_id] in (?, ?, ?) or [regulator_user_id] is null order by [customer_family_name] asc"

还有我的过滤器:

if (array_key_exists('regulator', $request->filter)) {

      $regulator_array = explode(",", $request->filter['regulator']);

      if(is_array($regulator_array)) {
                $query->whereIn('regulator_user_id', $regulator_array)->orWhereNull('regulator_user_id');
       }

  }

看起来 orWhereNull 是问题所在。我想返回

的每一行

regulator_user_id 在该数组中 以及所有监管者用户 ID 为空的地方

但所有其他过滤器都应按预期工作。

我该怎么做?

【问题讨论】:

  • $Tasks = $query->toSql(); 将向您显示 sql 代码。通过barryvdh 更好地使用调试栏。另外,试试$query = $query->where('customer_family_name', 'LIKE', $searchText.'%');

标签: laravel eloquent


【解决方案1】:

或者你可以使用这个甜美的方法when(),这样你就不必使用if语句和打破方法链接,而是你得到了流畅的查询构建。 Eloquent when()

【讨论】:

    【解决方案2】:

    正如 Jhonny Walker 所说,您不应该每次都保存
    $query,而是每次都使用 $query->where。 $Tasks = $query->get(); 之前的一行
    尝试调试使用以下命令生成的 mysql 命令。

    dd($query->toSql()); 

    如果您想粘贴结果以帮助您使用 where 子句。

    【讨论】:

      【解决方案3】:

      好吧,我找到了正确的解决方案:

      我需要我自己的查询函数来将 Where 与 orWhereNull 结合起来:

           if(is_array($regulator_array)) {
                $query = $query->where(function($query) use($regulator_array)  {
                     $query->whereIn('regulator_user_id', $regulator_array)
                              ->orWhereNull('regulator_user_id');
                      });
                  }
      

      现在查询工作正常。谢谢大家的回答。

      【讨论】:

        【解决方案4】:

        您不应该重新保存到您的 $query 变量:

        $query = $query->whereDate(....);
        

        将其更改为此(以及您的其他过滤器):

        $query->whereDate(....);
        

        你的最终命令:

        $Tasks = $query->get();
        

        然后将根据添加到您的$query 对象的额外查询返回正确的数据。

        【讨论】:

        • 谢谢 - 我以前也试过这个,同样的问题。它返回 4 行,它应该只返回 1。它似乎自动生成一个“orWhere” - 有没有办法调试查询?
        • 我已经发现问题出在 orWhereNull() - Eloquent 使这个全局化,而不是查询的确切部分。请参阅我的编辑。
        猜你喜欢
        • 1970-01-01
        • 2015-09-05
        • 2019-10-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-30
        • 1970-01-01
        相关资源
        最近更新 更多