在WHERE中使用OR子句或在雄辩的laravel中使用HAVING

时间:2018-03-13 05:58:56

标签: php laravel eloquent laravel-eloquent

我正在开发一个用于构建REST api的laravel项目。我正在使用eloquent从数据库中获取数据。我在WHERE,HAVING等中应用OR条件时遇到问题。如果只有一个where和one orWhere条件,它没有问题但是在这里我采用多个where子句。就像我们编写核心mysql查询一样,我们可以像

一样编写
SELECT * FROM table_name WHERE uid = 1 
AND (id = 1 AND name = test1) OR (id = 2 AND name = test2);

但是当我们使用雄辩并且如果我们在模型中使用orWhere时,为此我们需要做类似的事情

Model::select('*')->where('uid', '1')
->where('id', '1')
->where('name', 'test1')
->orWhere('uid', '1')
->where('id', '1')
->where('name', 'test1')
->get();

有时当我尝试制作任何可以根据表的参数数量搜索数据的搜索API时,我需要多次编写相同的代码。

3 个答案:

答案 0 :(得分:4)

orWhere()

使用where()parameter grouping关闭
Model::select('*')->where('uid', '1')->where(function($q){
       $q->where('id', '1')->where('name', 'test1')
    })->orWhere(function($q){
          $q->where('id', '1')->where('name', 'test1')
     })->get();

来自文档

  

Closure传递给orWhere方法会指示查询构建器开始一个约束组。 Closure将接收一个查询构建器实例,您可以使用该实例设置括号内应包含的约束。

答案 1 :(得分:1)

括号eloquent中的等价物将使用闭包作为whereorWhere

的参数

(a or b) and (c or d)将是:

->where(function($q){
  $q->where(a)->orWhere(b);
})->where(function($q){
  $q->where(c)->orWhere(d);
});

(a and b) or (c and d)将是:

->where(function($q){
  $q->where(a)->where(b);
})->orWhere(function($q){
  $q->where(c)->where(d);
});

a or b and c or d将是:

->where(a)->orWhere(b)->where(c)->orWhere(d)

这是完全不同的东西。

答案 2 :(得分:0)

此代码对您有所帮助

Model::where([['uid', '1'],['id', '1'],['name', 'test1']])
->orWhere([['uid', '1'],['id', '1'],['name', 'test1']])
->get();