Eloquent ile “boş değilse” nasıl kontrol edersiniz?


218

Bir alanın boş olup olmadığını nasıl kontrol edersiniz?Eloquent ile ?

Denedim Model::where('sent_at', 'IS NOT', DB::raw('null'))->...ama IS NOTbir karşılaştırma yerine bir bağlayıcı olarak verir .

Bu konuda DB::getQueryLog()şöyle diyor:

  '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 yerine kullanmayı deneyebilirsiniz .
JaTochNietDan

1
@JaTochNietDan! = Operatörü NULL değerleriyle çalışmaz. Başına MySQL Dokümantasyon : "Böyle =, <, veya <> NULL testine olarak aritmetik karşılaştırma operatörlerini kullanamaz."
Soulriser

Yanıtlar:


402

Eloquent'in bunun için bir yöntemi vardır (Laravel 4. * / 5. *);

Model::whereNotNull('sent_at')

Laravel 3:

Model::where_not_null('sent_at')

1
Ben silinmiş alanda null kontrol etmek gerekir, bu yüzden bu içine değişti whereNull('deleted_at')ve benim sorgu çalışan var.
Tarunn

7
Belgelenmemiş başka bir özellik. API belgelerini saymazsanız, ancak Laravel'in ana dokümanları bundan bahsetmez.
15'te

12
whereNotNull()Yöntemi (ve daha önce dökümante edilmiş birçok diğerleri) sürüm 5.1 belgelerine ilave edilmiştir: laravel.com/docs/5.1/queries#where-clauses .
Ben Johnson

@Aross ama Query Builder'da, Eloquent'de değil (Laravel 5.1)
pmiranda

@pmiranda ne demek istediğinden emin değilim, ama benim yorumum 4 yıl önceydi ve Laravel 4 hakkında, bugünlerde Laravel 6'dayız. Sanırım durum değişti. Laravel'in ana belgeleri hala tam olmasa da, daha çok bir rehber gibi geliyor.
23'te

20

Benim gibi biri Laravel 5.2.23'te sorgu oluşturucu ile yapmak istiyorsa, bu gibi yapılabilir ->

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

Veya modelin kapsamı ile:

public function scopeNotNullOnly($query){

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

1
ne anlama geliyor 'and'?
nöbetçi

1
Aslında burada 've' hiçbir şey yapmaz ama ilk parametre bir dizi olsaydı yapardı. İşte yöntem prototip: public function where($column, $operator = null, $value = null, $boolean = 'and'); ve konum -".....\vendor\laravel\framework\src\Illuminate\Database\Query\Builder.php"
Atiqur


4

Kullanabiliriz

Model::whereNotNull('sent_at');

Veya

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

4

Bu sorunun biraz eski olduğunu görüyorum ama bir cevap aramak için karşı karşıya geldim. Her ne kadar buradaki cevaplarla başarılı olamasam da bunun PHP 7.2 ve Laravel 5.7'de olduğum için olabileceğini düşünüyorum . ya da mümkün çünkü Laravel Tinker kullanarak CLI'daki bazı verilerle oynuyordum.

Benim için çalıştığım bazı şeyler var ve diğerleri için başkalarına yardım edeceğini ummadığım şeyler var.


Başarı elde etmedim:

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

Yukarıdakilerin hepsi benim için boş bir dizi döndürdü


Ancak başarılı çalışan var:

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

Bu beklediğim gibi bir dizideki tüm sonuçları döndürdü. Not: İsterseniz dizi yerine Illuminate \ Database \ Eloquent \ Collection'ı bırakıp all()geri alabilirsiniz .


0

içinde laravel 5.4 bu kod Model::whereNotNull('column')eklemeniz gerekir çalışma değildi get()bu gibi Model::whereNotNull('column')->get();bu benim için para cezası çalışır.


-11

Silinen kaydı (Yumuşak Silinen Kayıt) aramak istiyorsanız, Eloquent Model Query kullanmayın. Bunun yerine Db :: tablo sorgusunu kullanın. Örneğin aşağıda kullanmak yerine:

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

kullanın:

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

Bu cevabın soru ile ilgisi yoktur. Bunun yanı sıra Db::table, yumuşak silinen kayıtları bulmak için de kullanmanız gerekmez . Bunları withTrashed(), dokümanlarda anlatıldığı gibi yöntemle filtreleyebilirsiniz : laravel.com/docs/5.3/eloquent
gvsrepins
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.