Laravel Eloquent OR WHERE IS NOT NULL

Posted

技术标签:

【中文标题】Laravel Eloquent OR WHERE IS NOT NULL【英文标题】: 【发布时间】:2014-12-08 07:07:45 【问题描述】:

我正在使用来自frozennode 的 Laravel Administrator 包。长话短说,我在显示软删除的结果时遇到了问题。我正在尝试覆盖默认查询:

select * from `scripts` where `scripts`.`deleted_at` is null group by `scripts`.`id`

显示已删除和未删除的结果,以某种方式破解。这不是最优雅的解决方案,但我看不到任何其他方法。所以,我的目标是这样做:

select * from `scripts` where `scripts`.`deleted_at` is null or `scripts`.`deleted_at` is not null group by `scripts`.`id`

不幸的是,我不知道如何将 orWhere() 与“不为空”一起使用。经过一番研究,我尝试了一个原始的 SQL 块,如下所示:

'query_filter'=> function($query) 
    $query->orWhere(DB::raw('`scripts`.`deleted_at` is not null'));
,

但我最终得到了一条额外的 SQL,导致 orWhere() 中不包含第二个参数:

select * from `scripts` where `scripts`.`deleted_at` is null or `scripts`.`deleted_at` is not null **is null** group by `scripts`.`id`

我该如何解决这个问题?

【问题讨论】:

【参考方案1】:

只需添加withTrashed:

'query_filter'=> function($query) 
    $query->withTrashed();
,

Source

更新

在这种情况下,您可能只需添加一个orWhereNotNull() 调用:

'query_filter'=> function($query) 
    $query->orWhereNotNull('deleted_at');
,

【讨论】:

不幸的是,这不起作用。我收到对未定义方法 Illuminate\Database\Query\Builder::withTrashed() 错误的调用。【参考方案2】:

如果要搜索已删除记录(Soft Deleted Record),请不要使用 Eloquent Model Query。 而是使用Db::table query 例如 而不是使用下面:

$stu = Student::where('rollNum', '=', $rollNum . '-' . $nursery)->first();

使用

$stu = DB::table('students')->where('rollNum', '=', $newRollNo)->first();

【讨论】:

【参考方案3】:

Eloquent 有一个用于 (Laravel 4.* | 5.*) 的方法:

Model::whereNotNull('sent_at')

Laravel 3: Model::where_not_null('sent_at')

【讨论】:

【参考方案4】:

这可能是相关的:

return $this->join($table, $first, $operator, $second, 'right');

(来自GitHub)。

【讨论】:

以上是关于Laravel Eloquent OR WHERE IS NOT NULL的主要内容,如果未能解决你的问题,请参考以下文章

Eloquent:find() 和 where() 用法 laravel

Laravel Eloquent - 返回 Where Has + Where [重复]

如何处理带有斜线的 Laravel Eloquent “WHERE”查询? (Laravel 5.3)

如何使用 Laravel Eloquent 创建多个 Where 子句查询?

如何使用 Laravel Eloquent 创建多个 Where 子句查询?

Laravel Eloquent LEFT JOIN WHERE NULL