选择所有 3 列同时不为空的位置(Laravel 查询生成器)

Per*_*ika 1 mysql laravel eloquent laravel-5 laravel-query-builder

有一个articles数据库表(和Article模型),其中包含以下 3 列:

  • col_1
  • col_2
  • col_3

如何选择这三列不 NULL 同时的所有文章?

因此,如果col_1 = NULL和- 不要选择(包含)这些文章col_2 = NULLcol_3 = NULL但如果这些列中的一列或多列不是NULL- 则选择(包含)它。

其查询生成器如下所示:

Article::select('articles.*')-> ... ->get();
Run Code Online (Sandbox Code Playgroud)

当然,取而代之的...是检查所有这 3 列是否同时为空。

我知道这是错误的:

Article::select('articles.*')
       ->whereNotNull('col_1')
       ->whereNotNull('col_2')
       ->whereNotNull('col_3')
       ->get();
Run Code Online (Sandbox Code Playgroud)

...因为它不会选择(包含)其中一篇为 NULL ( col_1) 且其余 (col_2col_3) 不为 NULL 的文章。

- - - - - - - - - 更新: - - - - - - - - -

澄清一下:我想选择(包含) 、 、 和 中没有一个或其中一两个是 的文章,但如果所有三个都是 ,则不选择col_1col_2col_3NULL NULL

Mih*_*nde 6

您正在寻找的查询生成器是:

$articles = Article::where(function($q){
   return $q->whereNotNull('col_1')
       ->orWhereNotNull('col_2')
       ->orWhereNotNull('col_3');
})->get();
Run Code Online (Sandbox Code Playgroud)

在闭包中添加 or 子句的原因是to group them。因此,如果将来您想添加另一个位置,例如:

SELECT
    *
FROM
    `articles`
WHERE 
    (`col_1` IS NOT NULL OR `col_2` IS NOT NULL OR `col_3` IS NOT NULL)
    AND
    `type` = 1
;
Run Code Online (Sandbox Code Playgroud)

您直接添加:

$articles = Article::where(function($q){
   return $q->whereNotNull('col_1')
       ->orWhereNotNull('col_2')
       ->orWhereNotNull('col_3');
})
->where('type', 1)->get();
Run Code Online (Sandbox Code Playgroud)

如果你这样做:

$articles = Article::orWhereNotNull('col_1') 
   ->orWhereNotNull('col_2')
   ->orWhereNotNull('col_3')
   ->where('type', 1)
   ->get();
Run Code Online (Sandbox Code Playgroud)

它会生成以下查询,这不是您需要的:

SELECT
    *
FROM
    `articles`
WHERE 
    `col_1` IS NOT NULL 
    OR `col_2` IS NOT NULL 
    OR `col_3` IS NOT NULL
    AND `type` = 1
;
Run Code Online (Sandbox Code Playgroud)