chi*_*t24 5 query-builder laravel laravel-4
是否可以在Laravel 4中执行以下操作?...
DB::table('myTable')
->select(DB::raw($columnNames))
->whereNotNull(function($query) use($columns) {
foreach ($columns as $column) {
$query->whereNotNull($column);
}
})
->get();
Run Code Online (Sandbox Code Playgroud)
如果我有下表:
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
Run Code Online (Sandbox Code Playgroud)
如果$columns是[age, weight]和$columnNames是'age, weight',然后将上述whereNotNull声明,我希望这样的输出:
age | weight
===================
NULL 150
12 80
22 120
Run Code Online (Sandbox Code Playgroud)
我怎么能这样做?
更新:
条件是返回所选列不是ALL的所有行.因此,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();
Run Code Online (Sandbox Code Playgroud)
另外(至少在您的示例中)您不需要单独的变量,$columnNames因为select它将接受列名称数组.
$query = DB::table('myTable')->select($columns);
Run Code Online (Sandbox Code Playgroud)
如果你碰巧需要更多条件(特别是那些条件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();
Run Code Online (Sandbox Code Playgroud)
嵌套在哪里将放置( )where子句.这意味着代替:
WHERE age IS NOT NULL OR weight IS NOT NULL AND foo = 'bar'
Run Code Online (Sandbox Code Playgroud)
你得到:
WHERE (age IS NOT NULL OR weight IS NOT NULL) AND foo = 'bar'
Run Code Online (Sandbox Code Playgroud)