2014-12-24 1 views
1

Laravel 4에서 다음 작업을 수행 할 수 있습니까? ...고급 위치 Laravel의 NNull 문

DB::table('myTable') 
    ->select(DB::raw($columnNames)) 
    ->whereNotNull(function($query) use($columns) { 
     foreach ($columns as $column) { 
      $query->whereNotNull($column); 
     } 
    }) 
    ->get(); 

만약 내가 다음과 같은 테이블이 :

: $columns 문은,이 같은 결과를 기대 whereNotNull [age, weight]$columnNames 다음 위의 적용, 'age, weight'입니다

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 

경우

age  | weight 
=================== 
NULL   150 
12   80 
22   120 

어떻게해야합니까?

UPDATE :

조건은 선택된 열이 모두 널 (null)이 아닌 모든 행을 반환하는 것입니다. 따라서 whereNotNull 절을 각 행의 각 (선택한) 열에 적용해야합니다. 모든 열이 NULL이면 whereNotNull은 false를 반환하고 해당 행은 결과의 일부가 아니어야합니다. 따라서 적어도 하나의 NULL이 아닌 값을 가진 행만 리턴되어야합니다.

+1

그래서 조건은 :'$의 columns' 중 하나 이상이 될 수 없다'NULL' 그 대신 수단? – lukasgeiter

+0

나는 내 질문에 조건을 명확히했다, 고마워! – chipit24

답변

2

합니다. 중요 : whereNotNull 대신 orWhereNotNull이되어야하므로 한 열만 NULL이 아니어야합니다.

$query = DB::table('myTable')->select(DB::raw($columnNames)); 

foreach($columns as $column){ 
    $query->orWhereNotNull($column); 
} 

$result = $query->get(); 

또한 (적어도 귀하의 예제와) 당신은 select 이후 별도의 변수 $columnNames는 열 이름의 배열을 받아 들일 필요가 없습니다.


당신은 어디 중첩 필요가 더 곳 조건 (AND 특히 사람)가 필요 하셨다면

$query = DB::table('myTable')->select($columns); 
:

$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();