Laravel查询构造器如何删除已存在的Where条件子句?
方案1:全局扩展查询构造器,实现通用removeWhere方法
可以仿照Laravel原生reorder()的实现逻辑,给查询构造器扩展一个全局可用的removeWhere()方法,满足按需清除where条件的需求:
- 在
app/Providers/AppServiceProvider.php的boot方法中注册宏:
use Illuminate\Database\Query\Builder; public function boot() { Builder::macro('removeWhere', function () { // 清空所有where条件 $this->wheres = []; // 清空where对应的参数绑定,避免SQL参数错位 $this->setBindings([], 'where'); return $this; }); }
- 使用时直接在需要清除条件的位置调用即可,之前设置的
with()、take()等非where条件会全部保留:
$q->removeWhere();
方案2:临时直接操作查询属性(无需全局扩展)
如果不想修改全局配置,也可以直接操作查询构造器的公共属性,临时清除where条件,两行代码即可实现相同效果:
// 清空where条件 $q->wheres = []; // 清空where对应的参数绑定 $q->setBindings([], 'where');
适配你业务场景的完整代码示例
$q = Thread::with('comments')->take(10); if(strlen($input) < 4){ $result = $q->where('title', '~', "^$input$")->get(); if($result->isNotEmpty()){ return $result; } // 在此处清除已添加的where条件 $q->wheres = []; $q->setBindings([], 'where'); // 全局注册宏后也可以写 $q->removeWhere(); } $result = $q->where('title', 'like', "%$input%")->get();
以上两种方案均兼容PostgreSQL的~正则匹配符和like操作符,不需要调用newQuery()重建查询,完全保留你之前设置的关联预加载、取数条数等条件。
内容的提问来源于stack exchange,提问作者Mwthreex
相关产品推荐
相关产品推荐

