Fasih - di mana tidak sama dengan


110

Saya saat ini menggunakan versi Laravel terbaru.

Saya sudah mencoba pertanyaan berikut:

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

Idealnya, ini harus mengembalikan semua catatan kecuali user_id = 2, tetapi mengembalikan larik kosong. Bagaimana cara mengatasinya?

Code::all()

Ini mengembalikan semua 4 catatan.

Model kode:

<?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');
    }

}

Jawaban:


216

Gunakan wheredengan !=operator dalam kombinasi denganwhereNull

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

1
Ini mengabaikan catatan NULL. Jika saya mengubah salah satu NULL ke beberapa id non-NULL selain 2, catatan itu dikembalikan. Yang saya maksud dengan 'itu' adalah MySQL.
aBhijit

Hati-hati, ini jebakan.
Yevgeniy Afanasyev

23

Untuk where field not emptyini berhasil bagi saya:

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

14

Meskipun ini sepertinya berhasil

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

Anda tidak boleh menggunakannya untuk tabel besar, karena sebagai aturan umum "atau" di klausa where Anda menghentikan kueri untuk menggunakan indeks. Anda beralih dari "Pencarian kunci" ke "pemindaian tabel lengkap"

masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini

Sebagai gantinya, coba Union

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

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.