Laravel中的高级whereNotNull语句

时间:2014-12-24 07:05:21

标签: laravel laravel-4 query-builder

是否可以在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值的行。

2 个答案:

答案 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();