在 Laravel 4 中可以执行以下操作吗? ...
DB::table('myTable')
->select(DB::raw($columnNames))
->whereNotNull(function($query) use($columns) {
foreach ($columns as $column) {
$query->whereNotNull($column);
}
})
->get();
如果我有下表:
table: myTable
id | name | age | weight
======================================
1 Jane NULL 150
2 NULL 12 80
3 Bob NULL NULL
4 John 22 120
5 Cody NULL NULL
If $columns
is [age, weight]
and $columnNames
is 'age, weight'
,然后应用上面的 whereNotNull 语句,我期望输出如下:
age | weight
===================
NULL 150
12 80
22 120
我怎样才能完成这件事?
UPDATE:
条件是返回所选列不全部为空的所有行。所以一个whereNotNull
子句必须应用于每行中的每个(选定的)列。如果所有列均为 NULL,则 whereNotNull 将返回 false,并且该行不应成为结果的一部分。因此,只应返回至少具有一个非 NULL 值的行。
如果这些是唯一的位置,那么您甚至不需要嵌套的位置。重要的:orWhereNotNull
代替whereNotNull
所以只有一列必须不是NULL
.
$query = DB::table('myTable')->select(DB::raw($columnNames));
foreach($columns as $column){
$query->orWhereNotNull($column);
}
$result = $query->get();
另外(至少在你的例子中)你不需要一个单独的变量$columnNames
since select
将接受列名数组。
$query = DB::table('myTable')->select($columns);
如果您碰巧需要更多 where 条件(尤其是具有AND
)你需要一个嵌套位置:
$query = DB::table('myTable')->select(DB::raw($columnNames));
$query->where(function($q) use ($columns){
foreach($columns as $column){
$q->orWhereNotNull($column);
}
});
$result = $query->get();
嵌套的放置位置(
)
围绕 where 子句。这意味着而不是:
WHERE age IS NOT NULL OR weight IS NOT NULL AND foo = 'bar'
You get:
WHERE (age IS NOT NULL OR weight IS NOT NULL) AND foo = 'bar'
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)