我有一个现有的laravel模型,其中许多条件链接到它。 即WHERE username ='john'AND(updated_at>“2017-01-01”OR ...)AND ...
我不知道有多少先前的查询,我无法访问它们。在收到某些条件后,我只能访问模型实例。
即我有一个函数接收模型作为其参数,我想要 向已存在的 wheres
添加OR条件function notDeleted($model) {
// model has already a bunch of where/or where conditions at this point
// i want return rows, that match either all the previous conditions
// OR this new condition that i add inside this function.
}
我想以下列方式添加OR条件。
Select * from users WHERE ( (query1 AND query2 AND ...) OR deleted_at IS NULL);
如果你只是使用 - > orWhere ,然后查询
select * from users where query1 AND query2 AND ... OR deleted_at is null
注意:表名,列等是由SO帖子组成的,我的实际用例有点复杂。
答案 0 :(得分:0)
尝试换行如下所示的条件
SomeModel::where(function($q){
$q->where(query1 AND query2 AND ...)
->orWhere(deleted_at IS NULL);
})->get();
以上代码只是一个示例。您需要根据自己的要求进行修改。
有关详细信息,请查看此链接Nested Parameter Grouping
答案 1 :(得分:0)
将要包装的条件放入闭包中:
$model->where(function($query) {
$query->where('field', 'value')
->where('field2', 'value');
})
->orWhereNull('deleted_at');
答案 2 :(得分:0)
我遇到了类似的问题,这就是我的解决方法:
// Create new \Illuminate\Database\Query\Builder with current wheres in a group
$new_query = $query_builder->getQuery()->forNestedWhere();
$new_query->addNestedWhereQuery($query_builder->getQuery());
// Add the new query in another group
$new_query->whereIn($fk_field,
function($q) use ($index_name, $args) {
// Ignore the Sphinx stuff, just add your new condition here.
$q->select(\DB::raw(SphinxSearch::getRawSelect($index_name)))
->where('query', SphinxSearch::getRawQueryString($args));
});
// Replace original \Illuminate\Database\Eloquent\Builder's internal
// \Illuminate\Database\Query\Builder with the new one
$query_builder->setQuery($new_query);