是否可以在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
我怎样才能完成这项工作?
更新
条件是返回所选列不是ALL的所有行。因此,必须将whereNotNull
子句应用于每行中的每个(选定)列。如果所有列都为NULL,那么whereNotNull将返回false,并且该行不应该是结果的一部分。因此,只应返回至少具有一个非NULL值的行。
答案 0 :(得分:7)
如果那些只是你不在哪里,甚至不需要嵌套的地方。重要提示: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);
如果你碰巧需要更多条件(特别是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'
你得到:
WHERE (age IS NOT NULL OR weight IS NOT NULL) AND foo = 'bar'
答案 1 :(得分:1)
尝试使用where()作为包装方法。这只会显示同时具有年龄和体重的记录。
DB::table('myTable')
->select(DB::raw($columnNames))
->where(function($query) use($columns) {
foreach ($columns as $column) {
$query->whereNotNull($column);
}
})
->get();
要显示具有年龄或权重的任何记录,请在循环中使用orWhereNotNull()。
我认为没有理由说循环不起作用,因为你实际上是这样做的:
$query = $query->whereNotNull('age');
$query = $query->whereNotNull('weight');
$results = $query->get();