我想在某些条件下删除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();
...