Eloquent로 "null이 아닌 경우"를 어떻게 확인합니까?


218

Eloquent 에서 필드 가 null이 아닌지 어떻게 확인 합니까?

나는 시도 Model::where('sent_at', 'IS NOT', DB::raw('null'))->...했지만 IS NOT비교 대신 바인딩으로 제공합니다 .

이것에 대해 DB::getQueryLog()말합니다 :

  'query' => string 'select * from my_table where sent_at = ? and profile_id in (?, ?) order by created_at desc' (length=101)
  'bindings' => 
    array (size=3)
      0 => string 'IS NOT' (length=6)
      1 => int 1
      2 => int 4

!=IS NOT 대신 사용할 수 있습니다.
JaTochNietDan

1
@JaTochNietDan! = 연산자는 NULL 값으로 작동하지 않습니다. MySQL 문서에 따르면 : "=, <또는 <>와 같은 산술 비교 연산자를 사용하여 NULL을 테스트 할 수 없습니다."
Soulriser

답변:


402

Eloquent는이를위한 방법을 가지고 있습니다 (Laravel 4. * / 5. *).

Model::whereNotNull('sent_at')

라 라벨 3 :

Model::where_not_null('sent_at')

1
삭제 된 필드에서 null을 확인해야하므로 이로 변경 whereNull('deleted_at')하고 쿼리가 실행되었습니다.
Tarunn

7
문서화되지 않은 또 다른 기능. API 문서를 세지 않으면 Laravel의 주요 문서에는 언급하지 않습니다.
aross

12
whereNotNull()메소드 (및 이전에 문서화되지 않은 여러 가지)가 버전 5.1의 문서에 추가되었습니다 : laravel.com/docs/5.1/queries#where-clauses .
벤 존슨

@aross하지만 쿼리 빌더에서,하지 웅변에 (Laravel 5.1)
pmiranda

@pmiranda 당신이 무슨 뜻인지 잘 모르겠지만, 제 의견은 4 년 전이었고 오늘날 Laravel 4에 관한 것입니다. 오늘날 우리는 Laravel 6에 있습니다. 상황이 바뀐 것 같습니다. 라 라벨의 주요 문서는 여전히 완전하지는 않지만, 많은 가이드와 같은 느낌이 듭니다.
aross

20

나와 같은 사람이 Laravel 5.2.23의 쿼리 작성기를 사용하여 수행하려는 경우 다음과 같이 수행 할 수 있습니다.

 $searchResultQuery = Users::query(); 
 $searchResultQuery->where('status_message', '<>', '', 'and'); // is not null
 $searchResultQuery->where('is_deleted', 'IS NULL', null, 'and'); // is null 

또는 모델 범위가있는 경우 :

public function scopeNotNullOnly($query){

    return $query->where('status_message', '<>', '');
}

1
무엇을 'and'의미합니까?
센티

1
실제로 'and'는 아무것도하지 않지만 첫 번째 매개 변수가 배열이면 수행합니다. 다음은 메소드 프로토 타입입니다. public function where($column, $operator = null, $value = null, $boolean = 'and'); 및 위치".....\vendor\laravel\framework\src\Illuminate\Database\Query\Builder.php"
Atiqur

9

DB 파사드 를 사용하려는 경우 :

DB::table('table_name')->whereNotNull('sent_at')->get();


4

사용할 수있다

Model::whereNotNull('sent_at');

또는

Model::whereRaw('sent_at is not null');

4

나는이 질문이 약간 오래되었지만 답을 찾기 위해 그것을 뛰어 넘었다. 여기서 답변 을 얻지 못했지만 PHP 7.2Laravel 5.7을 사용 하고 있기 때문일 수 있습니다 . Laravel Tinker를 사용하여 CLI의 일부 데이터를 가지고 놀았 기 때문에 가능합니다.

나는 내가 시도한 것들과 다른 사람들을 도울 희망이없는 다른 것들을 가지고있다.


나는 성공을 거두지 못했습니다.

    MyModel::whereNotNull('deleted_by')->get()->all();             // []
    MyModel::where('deleted_by', '<>', null)->get()->all();        // []
    MyModel::where('deleted_by', '!=', null)->get()->all();        // []
    MyModel::where('deleted_by', '<>', '', 'and')->get()->all();   // []
    MyModel::where('deleted_by', '<>', null, 'and')->get()->all(); // []
    MyModel::where('deleted_by', 'IS NOT', null)->get()->all();    // []

위의 모든 것이 빈 배열을 반환했습니다.


그러나 나는 성공을 거두었 다.

    DB::table('my_models')->whereNotNull('deleted_by')->get()->all(); // [ ... ]

이것은 예상대로 배열의 모든 결과를 반환했습니다. 참고 : 원하는 경우 배열을 삭제하고 배열 대신 Illuminate \ Database \ Eloquent \ Collection을all() 다시 가져올 수 있습니다 .


0

laravel 5.4 이 코드를 Model::whereNotNull('column')추가 할 필요가 작동하지 않는 get()이와 같은 Model::whereNotNull('column')->get();이 사람이 나를 위해 잘 작동합니다.


-11

삭제 된 레코드 (소프트 삭제 된 레코드)를 검색하려면 Eloquent Model Query를 사용하지 마십시오. 대신 Db :: table 쿼리를 사용하십시오 (예 : 아래 대신 사용).

$stu = Student::where('rollNum', '=', $rollNum . '-' . $nursery)->first();

사용하다:

$stu = DB::table('students')->where('rollNum', '=', $newRollNo)->first();

이 답변은 질문과 관련이 없습니다. 또한 Db::table소프트 삭제 된 레코드를 찾기 위해 사용할 필요는 없습니다 . 당신은 방법을 필터링 할 수 있습니다 withTrashed(): 워드 프로세서에서 말한 것처럼, laravel.com/docs/5.3/eloquent
gvsrepins
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.