在 WHERE 中应用 OR 子句或在 eloquent laravel 中应用 HAVING

Apply OR clause in WHERE or HAVING in eloquent laravel

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

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

但是当我们使用 eloquent 并且如果我们在模型中使用 orWhere 时,我们需要做类似

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

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

parameter grouping

使用where()orWhere()闭包
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();

来自文档

Passing a Closure into the orWhere method instructs the query builder to begin a constraint group. The Closure will receive a query builder instance which you can use to set the constraints that should be contained within the parenthesis group.

此代码会对您有所帮助

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

括号中 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)

这是完全不同的东西。