Eloquent-같지 않은 곳


110

현재 최신 Laravel 버전을 사용하고 있습니다.

다음 쿼리를 시도했습니다.

Code::where('to_be_used_by_user_id', '<>' , 2)->get()
Code::whereNotIn('to_be_used_by_user_id', [2])->get()
Code::where('to_be_used_by_user_id', 'NOT IN', 2)->get()

이상적으로는를 제외한 모든 레코드를 반환해야 user_id = 2하지만 빈 배열을 반환합니다. 이 문제를 어떻게 해결합니까?

Code::all()

4 개의 레코드가 모두 반환됩니다.

코드 모델 :

<?php namespace App;

use Illuminate\Database\Eloquent\Model;

class Code extends Model
{

    protected $fillable = ['value', 'registration_id', 'generated_for_user_id', 'to_be_used_by_user_id', 'code_type_id', 'is_used'];

    public function code_type()
    {
        return $this->belongsTo('App\CodeType');
    }

}

답변:


215

사용 where!=함께 연산자whereNull

Code::where('to_be_used_by_user_id', '!=' , 2)->orWhereNull('to_be_used_by_user_id')->get()

1
NULL 레코드를 무시합니다. NULL 중 하나를 2가 아닌 NULL이 아닌 ID로 변경하면 해당 레코드가 반환됩니다. 'it'은 MySQL을 의미합니다.
aBhijit

조심하세요, 함정입니다.
예브게니 Afanasyev

23

들어 where field not empty이 나를 위해 일한 :

->where('table_name.field_name', '<>', '')

14

이것이 작동하는 것 같지만

Code::query()
    ->where('to_be_used_by_user_id', '!=' , 2)
    ->orWhereNull('to_be_used_by_user_id')
    ->get();

일반적으로 where 절에서 "or"는 인덱스를 사용하는 쿼리를 중지하므로 큰 테이블에는 사용하지 않아야합니다. "키 조회"에서 "전체 테이블 스캔"으로 이동합니다.

여기에 이미지 설명 입력 여기에 이미지 설명 입력

대신 Union을 사용해보십시오

$first = Code::whereNull('to_be_used_by_user_id');

$code = Code::where('to_be_used_by_user_id', '!=' , 2)
        ->union($first)
        ->get();

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.