Laravel动态where子句

时间:2016-08-22 09:23:01

标签: laravel eloquent

我想用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子句。

但搜索姓氏不起作用。我有什么不对吗?我怎样才能将它正确组合起来?有没有办法用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在该数组中 AND所有其中regulator_user_id IS NULL

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

我该怎么做?

4 个答案:

答案 0 :(得分:0)

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

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

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

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

你的最后命令:

$Tasks = $query->get();

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

答案 1 :(得分:0)

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

dd($query->toSql()); 

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

答案 2 :(得分:0)

Ok ill找到了正确的解决方案:

我需要自己的查询功能来将Where与orNhereNull结合起来:

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

现在查询工作正常。谢谢你的所有答案。

答案 3 :(得分:0)

或者你可以在()时使用这种甜言蜜语的方法,所以你不必使用if语句并打破方法链,而是你得到了流畅的查询构建。 Eloquent when()