删除现有的Where子句



我想在某些条件下删除where子句:

$q = Thread::with('comments')->take(10);
if(strlen($input) < 4){
$result = $q->where('title', '~', "^$input$")->get();
if($result->isNotEmpty()){
return $result;
}
// if was empty:
}
// How to clean the where clause from the above here? because it affect the query below:
$result = $q->where('title', 'like', "%$input%")->get();

问题是第一个where子句影响第二个,如果数据是空的,我如何在需要时删除现有的where子句?在我的情况下,newQuery()也不起作用。

请注意,我在postgres~和'like'中使用了两个单独的语句

类似于reorder()对于where子句

是有办法的

$q = Thread::with('comments')->take(10);
if(strlen($input) < 4){
$result = $q->where('title', '~', "^$input$")->get();
if($result->isNotEmpty()){
return $results;
}
}

//getQuery ()是一个查询生成器方法,它包含您正在访问或试图构建的查询的所有分组,选择,顺序,位置,连接等。

$q->getQuery()->wheres= [];
$result = $q->where('title', 'like', "%$input%")->get();

使用条件从句

$threads = Thread::with('comments')->when(strlen($input) < 4, function ($query) use ($input) {
return $query->where('title', '~', "^$input$");
}, function ($query) use ($input) {
return $query->where('title', 'like', "%$input%");
})->take(10)->get();

https://laravel.com/docs/8.x/queries conditional-clauses

如果你想给它第二次修改,我会这样写逻辑。注释只在需要时才加载。

if (strlen($input) < 4) {
$threads = Thread::where('title', '~', "^$input$")->take(10)->get();
if ($threads->isNotEmpty()) {
return $threads->load('comments');
}
}
return Thread::with('comments')->where('title', 'like', "%$input%")->take(10)->get();

如果在克隆之前添加where它的工作原理与删除

...
if(strlen($input) < 4){
$result = (clone $q)->where('title', '~', "^$input$")->get();
if($result->isNotEmpty()){
return $results;
}
}
$result = $q->where('title', 'like', "%$input%")->get();
...