我正在开发一个用于构建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时,我需要多次编写相同的代码。
答案 0 :(得分:4)
对orWhere()
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
中的等价物将使用闭包作为where
或orWhere
(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();