2014-12-24 2 views
1

Можно ли сделать следующее в Laravel 4? ...Продвинутый whereNotNull заявление в Laravel

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 

Как это сделать?

UPDATE:

Это условие, чтобы вернуть все строки, в которых выбранные столбцы, не все нуль. Поэтому в каждый столбец каждой строки должен быть применен параметр whereNotNull. Если все столбцы NULL, то whereNotNull вернет false, и эта строка не должна быть частью результатов. Таким образом, должны быть возвращены только строки с AT LEAST одним значением, отличным от NULL.

+1

Так условие: по крайней мере, один из '$ columns' не может быть' NULL'? – lukasgeiter

+0

Я уточнил условие в моем вопросе, спасибо! – chipit24

ответ

2

Если те только, где ты даже не нужен вложенными где. Важно: 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 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

Попробуйте использовать 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();

Смежные вопросы