Bagaimana Anda memeriksa "jika tidak null" dengan Eloquent?

218

Bagaimana Anda memeriksa jika bidang tidak null dengan Eloquent?

Saya mencoba Model::where('sent_at', 'IS NOT', DB::raw('null'))->...tetapi memberi IS NOTsebagai pengikat bukan sebagai perbandingan.

Inilah yang DB::getQueryLog()dikatakan tentang hal itu:

  '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
Marwelln
sumber
Anda bisa mencoba menggunakan !=bukannya TIDAK.
JaTochNietDan
1
@JaTochNietDan Operator! = Tidak bekerja dengan nilai NULL. Per Dokumentasi MySQL : "Anda tidak dapat menggunakan operator perbandingan aritmatika seperti =, <, atau <> untuk menguji NULL."
Soulriser

Jawaban:

402

Eloquent memiliki metode untuk itu (Laravel 4. * / 5. *);

Model::whereNotNull('sent_at')

Laravel 3:

Model::where_not_null('sent_at')
Bas
sumber
1
Saya perlu memeriksa nol pada bidang yang dihapus, jadi saya mengubahnya menjadi whereNull('deleted_at')dan saya menjalankan kueri saya.
Tarunn
7
Fitur tidak berdokumen lain . Yah, kecuali Anda menghitung dokumentasi API, tetapi dokumentasi utama Laravel tidak menyebutkannya.
aross
12
The whereNotNull()Metode (dan beberapa orang lain yang didokumentasikan sebelumnya) yang ditambahkan ke dalam dokumentasi dalam versi 5.1: laravel.com/docs/5.1/queries#where-clauses .
Ben Johnson
@ Aross tetapi dalam Query Builder, bukan di Eloquent (Laravel 5.1)
pmiranda
@ pmiranda tidak yakin apa yang Anda maksud, tetapi komentar saya adalah 4 tahun yang lalu dan tentang Laravel 4, saat ini kami berada di Laravel 6. Saya kira situasinya berubah. Meskipun dokumentasi utama Laravel masih belum lengkap, rasanya lebih seperti kumpulan panduan.
aross
20

Jika seseorang seperti saya ingin melakukannya dengan pembangun permintaan di Laravel 5.2.23 itu bisa dilakukan seperti ->

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

Atau dengan cakupan dalam model:

public function scopeNotNullOnly($query){

    return $query->where('status_message', '<>', '');
}
Atiqur
sumber
1
apa artinya 'and'?
Senty
1
Sebenarnya di sini 'dan' tidak melakukan apa pun kecuali itu akan dilakukan jika parameter pertama adalah array. Berikut adalah prototipe metode: public function where($column, $operator = null, $value = null, $boolean = 'and'); dan lokasi -".....\vendor\laravel\framework\src\Illuminate\Database\Query\Builder.php"
Atiqur
8

Jika Anda ingin menggunakan fasad DB :

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

Jon
sumber
4

Kita bisa menggunakan

Model::whereNotNull('sent_at');

Atau

Model::whereRaw('sent_at is not null');
srmilon
sumber
4

Saya melihat pertanyaan ini agak lama tetapi saya berlari melewatinya mencari jawaban. Walaupun saya tidak berhasil dengan jawaban di sini saya pikir ini mungkin karena saya menggunakan PHP 7.2 dan Laravel 5.7.atau mungkin karena saya hanya bermain-main dengan beberapa data di CLI menggunakan Laravel Tinker.

Saya memiliki beberapa hal yang saya coba yang bekerja untuk saya dan orang lain yang tidak saya harap akan membantu orang lain.


Saya tidak berhasil berlari:

    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();    // []

Semua hal di atas mengembalikan array kosong untuk saya


Namun saya berhasil menjalankan:

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

Ini mengembalikan semua hasil dalam array seperti yang saya harapkan. Catatan: Anda dapat menjatuhkan all()dan mengembalikan Koleksi Illuminate \ Database \ Eloquent \ daripada sebuah array jika Anda mau.

Rockin4Life33
sumber
0

di laravel 5.4 kode Model::whereNotNull('column')ini tidak berfungsi, Anda perlu menambahkan get()seperti ini yang Model::whereNotNull('column')->get();ini berfungsi dengan baik untuk saya.

Carding Ermita Sungkit
sumber
-11

Jika Anda ingin mencari catatan yang dihapus (Soft Deleted Record), jangan gunakan Eloquent Model Query pengguna. Alih-alih menggunakan Db :: tabel kueri misalnya Alih-alih menggunakan Di Bawah ini:

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

Menggunakan:

$stu = DB::table('students')->where('rollNum', '=', $newRollNo)->first();
pengguna4397894
sumber
Jawaban ini tidak ada hubungannya dengan pertanyaan. Selain itu, Anda tidak perlu menggunakannya Db::tableuntuk menemukan catatan yang terhapus secara lunak. Anda dapat memfilternya dengan metode ini withTrashed(), seperti diceritakan dalam dokumen: laravel.com/docs/5.3/eloquent
gvsrepins