Laravel 5中如何编写含AND、OR、AND的WHERE子句?
在Laravel中编写包含AND、OR、AND逻辑的WHERE查询
其实Laravel的查询构造器专门针对这种带分组的逻辑条件做了支持,直接用普通的where和orWhere容易导致逻辑混乱,关键是用闭包来创建分组的WHERE子句,我给你分两种常见场景举例:
场景1:主逻辑为AND,中间嵌套OR分组
比如你要实现的SQL是:
SELECT * FROM your_table WHERE column1 = ? AND (column2 = ? OR column3 = ?) AND column4 = ?
对应的Laravel代码写法:
$results = DB::table('your_table') // 第一个AND条件 ->where('column1', '=', $value1) // 用闭包包裹OR分组,自动生成括号 ->where(function ($query) use ($value2, $value3) { $query->where('column2', '=', $value2) ->orWhere('column3', '=', $value3); }) // 最后一个AND条件 ->where('column4', '=', $value4) ->get();
这里的闭包会把内部的where和orWhere包裹在括号里,完美实现AND (OR) AND的逻辑。
场景2:OR连接两个AND分组
如果你的需求是类似这样的SQL:
SELECT * FROM your_table WHERE (column1 = ? AND column2 = ?) OR (column3 = ? AND column4 = ?)
对应的Laravel代码:
$results = DB::table('your_table') // 第一个AND分组 ->where(function ($query) use ($value1, $value2) { $query->where('column1', '=', $value1) ->where('column2', '=', $value2); }) // OR连接第二个AND分组 ->orWhere(function ($query) use ($value3, $value4) { $query->where('column3', '=', $value3) ->where('column4', '=', $value4); }) ->get();
额外提示
- 如果你用Eloquent模型,写法和查询构造器完全一致,把
DB::table('your_table')换成你的模型类即可,比如YourModel::where(...) - 这种方式会自动帮你处理参数绑定,避免SQL注入,比直接拼接原生SQL安全得多
- 更复杂的嵌套逻辑也可以用同样的方式,多层嵌套闭包就行
内容的提问来源于stack exchange,提问作者Yannick jansen
相关产品推荐
相关产品推荐

