有articles
个DB表(和Article
模型)(除其他外)具有以下3列:
col_1
col_2
col_3
如何选择不同时不 NULL
这三列的所有文章?
因此,如果col_1 = NULL
和col_2 = NULL
和col_3 = NULL
-不要选择(包括)这些文章。但是,如果其中一列或多列不是NULL
-请选择(包括)它。
用于此的查询生成器如下所示:
Article::select('articles.*')-> ... ->get();
当然,不是...
,而是要检查所有这三列是否同时不为空 。
我知道这是错误的:
Article::select('articles.*')
->whereNotNull('col_1')
->whereNotNull('col_2')
->whereNotNull('col_3')
->get();
...,因为它不会选择(包括)以下文章,例如,其中一个为NULL(col_1
),其余的(col_2
和col_3
)不为NULL
------------------更新:------------------ >
要澄清一下:我想选择(包括)其中col_1
,col_2
和col_3
中的一两个都不是的文章}},但如果三个都为 NULL
,则不是。
答案 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
,但也必须自己找出自己的答案。