在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'

09-20 01:31