Per*_*ika 1 mysql laravel eloquent laravel-5 laravel-query-builder
有一个articles数据库表(和Article模型),其中包含以下 3 列:
col_1col_2col_3如何选择这三列不 NULL 同时的所有文章?
因此,如果col_1 = NULL和- 不要选择(包含)这些文章col_2 = NULL。col_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_2和col_3) 不为 NULL 的文章。
- - - - - - - - - 更新: - - - - - - - - -
澄清一下:我想选择(包含) 、 、 和 中没有一个或其中一两个是 的文章,但如果所有三个都是 ,则不选择。col_1col_2col_3NULL NULL
您正在寻找的查询生成器是:
$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)
| 归档时间: |
|
| 查看次数: |
8927 次 |
| 最近记录: |