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

时间:2019-02-19 21:26:44

标签: mysql laravel laravel-5 eloquent laravel-query-builder

articles个DB表(和Article模型)(除其他外)具有以下3列:

  • col_1
  • col_2
  • col_3

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

因此,如果col_1 = NULLcol_2 = NULLcol_3 = NULL-不要选择(包括)这些文章。但是,如果其中一列或多列不是NULL-请选择(包括)它。

用于此的查询生成器如下所示:

Article::select('articles.*')-> ... ->get();

当然,不是...,而是要检查所有这三列是否同时为空

我知道这是错误的:

Article::select('articles.*')
       ->whereNotNull('col_1')
       ->whereNotNull('col_2')
       ->whereNotNull('col_3')
       ->get();

...,因为它不会选择(包括)以下文章,例如,其中一个为NULL(col_1),其余的(col_2col_3)不为NULL

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

要澄清一下:我想选择(包括)其中col_1col_2col_3中的一两个都不是的文章}},但如果三个都为 NULL,则不是。

2 个答案:

答案 0 :(得分:3)

您正在寻找的查询构建器是:

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

在闭包中添加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
;

您直接添加了:

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

如果您这样做:

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

它使下面的查询不是您需要的内容:

SELECT
    *
FROM
    `articles`
WHERE 
    `col_1` IS NOT NULL 
    OR `col_2` IS NOT NULL 
    OR `col_3` IS NOT NULL
    AND `type` = 1
;

答案 1 :(得分:2)

您要查找的查询为:

SELECT
    *
FROM
    `articles`
WHERE
    `col_1` IS NOT NULL
    OR `col_2` IS NOT NULL
    OR `col_3` IS NOT NULL
;

在Laravel中,这将导致以下结果:

Article::orWhereNotNull('col_1') 
   ->orWhereNotNull('col_2')
   ->orWhereNotNull('col_3')
   ->get();

如果我没有记错的话,select('articles.*')中完全相同的选择由Eloquent完成。也许第一个orWhereNotNull应该是whereNotNull,但也必须自己找出自己的答案。