在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
如果
$columns
是[age, weight]
而$columnNames
是'age, weight'
,则应用上面的whereNotNull语句,我期望输出如下:age | weight
===================
NULL 150
12 80
22 120
我怎样才能做到这一点?
更新:
条件是返回所有的行,其中选定的列不全为空。因此,必须将
whereNotNull
子句应用于每行中的每个(选定)列。如果所有列均为NULL,则whereNotNull将返回false,并且该行不应成为结果的一部分。因此,仅应返回具有至少一个非空值的行。 最佳答案
如果这些是唯一的位置,那么您甚至不需要嵌套的位置。重要提示:orWhereNotNull
而不是whereNotNull
,因此只有一列不是NULL
。
$query = DB::table('myTable')->select(DB::raw($columnNames));
foreach($columns as $column){
$query->orWhereNotNull($column);
}
$result = $query->get();
另外(至少在您的示例中)您不需要单独的变量
$columnNames
,因为select
将接受列名数组。$query = DB::table('myTable')->select($columns);
如果您碰巧需要更多的where条件(尤其是带有
AND
的条件),则需要一个嵌套的where:$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子句周围放置
(
)
。那意味着代替:WHERE age IS NOT NULL OR weight IS NOT NULL AND foo = 'bar'
你得到:
WHERE (age IS NOT NULL OR weight IS NOT NULL) AND foo = 'bar'