Soru Eloquent koleksiyonu: saymak ve boş belirlemek


Bu belki de önemsiz bir soru ama Laravel'in bir Eloquent koleksiyonunun iade edilip edilmediğini kontrol etmek için belirli bir yol önerip önermediğini merak ediyorum. $result = Model::where(...)->get() öğelerin sayısını saymanın yanı sıra boştur.

Şu anda kullanıyoruz !$result Boş sonucu tespit etmek için yeterli mi? Gelince count($result)Aslında boş sonuç da dahil olmak üzere tüm vakaları kapsamıyor mu?


180
2017-12-13 09:35


Menşei




Cevaplar:


Kullanırken ->get() Aşağıdakilerden herhangi birini kullanamazsınız:

if (empty($result)) { }
if (!$result) { }
if ($result) { }

Çünkü eğer sen dd($result); bir örneğini fark edeceksiniz Illuminate\Support\Collection sonuç olmadığı zaman bile her zaman iade edilir. Esasen kontrol ettiğin şey $a = new stdClass; if ($a) { ... } her zaman doğru geri dönecek.

Herhangi bir sonuç olup olmadığını belirlemek için aşağıdakilerden herhangi birini yapabilirsiniz:

if ($result->first()) { } 
if (!$result->isEmpty()) { }
if ($result->count()) { }
if (count($result)) { }

Ayrıca kullanabilirsiniz ->first() yerine ->get() ilk bulunan modelin bir örneğini döndürecek olan sorgu oluşturucuda veya null aksi takdirde. Veritabanından yalnızca bir sonuca ihtiyacınız varsa veya bunu bekliyorsanız bu yararlıdır.

$result = Model::where(...)->first();
if ($result) { ... }

Notlar / Referanslar

Bonus Bilgileri

Toplama ve Sorgu Oluşturucusu farklılıkları Laravel'in yeni gelenleri için biraz kafa karıştırıcı olabilir, çünkü yöntem adları genellikle ikisi arasında aynıdır. Bu nedenle, üzerinde çalıştığınız şeyi bilmek kafa karıştırıcı olabilir. Sorgu Yürütücüsü, sorguyu yürütecek ve veritabanına erişecek bir yöntem çağırıncaya kadar (örneğin, ->all()  ->first()  ->lists() ve diğerleri). Bu yöntemler Ayrıca üzerinde var Collection Birden çok sonuç varsa Query Builder'dan döndürülen nesne. Hangi sınıfta çalıştığınızdan emin değilseniz, yapmayı deneyin. var_dump(User::all()) ve hangi sınıfların gerçekten geri döndüğünü görmeye çalışmak ( get_class(...)). Koleksiyon sınıfının kaynak kodunu kontrol etmenizi şiddetle tavsiye ediyorum, oldukça basit. Ardından Sorgu Oluşturucu'ya bakın ve işlev adlarındaki benzerlikleri görün ve veritabanına ne zaman ulaştığını öğrenin.


402
2017-12-14 16:22



thx, sadece sorguyu çalıştırırsanız bunu eklemek için first(), sonuç farklıdır get()ile kontrol edilebilir !$result boş sonuç olarak null - bitinn
btinn evet - eğer sen yaptın Model::first() - Aslında bu sorgu oluşturucu 'ilk' yöntem üzerinde hareket eden ve koleksiyon değil, bu nedenle veritabanından ilkini seçecektir - ancak Model::get() Yaptığınız takdirde Illuminate \ Support \ Collection örneğini döndürecek $r = Model::get() ve sonra $r->first() Bu koleksiyondaki ilk öğeyi seçecek. - Gary Green
Bu cevabın ele almaması gereken bir şey mi count($result) Eserleri; Bu detayın eklenmesi bir gelişme olacaktır. - Mark Amery
$ sonuç-> sayım ve sayım arasındaki fark nedir ($ sonuç) $ sonuç-> sayısı veritabanına tekrar girer mi? Değilse, sanırım bunlar aynı! - Kamy D
@pathros Bunu yapmanın kolay bir yolu yok. Kullanarak her koleksiyonun bir üyesi ile yinelemek zorunda foreach döngü ve sonra bu kontrollerden birini kullanın (düşün: count($collection->column)). - PapaHotelPapa


Bence arıyorsun:

$result->isEmpty()

Bu farklı empty($result)sonuç doğru olmayacak çünkü sonuç boş bir koleksiyon olacak. Öneriniz count($result) aynı zamanda iyi bir çözümdür. Dokümanlarda herhangi bir referans bulamıyorum


46
2017-12-13 10:23



Bağlantı bozuk. - Mark Amery
Tek yapmanız gereken, sadece $ collection-> sütununda belirli bir sütunun (özellik) boş / boş olup olmadığını kontrol etmek istersiniz? - Pathros


Yukarıdaki onaylanmış cevabı kabul ediyorum. Ama genellikle kullanırım $results->isNotEmpty() aşağıda verilen yöntem.

if($results->isNotEmpty())
{
//do something
}

Bundan daha ayrıntılı if(!results->isEmpty()) çünkü bazen '!' Önünde istenmeyen hataya neden olabilir.

Bu yöntemin sürümden geldiğini unutmayın. 5.3 itibaren.


6
2018-06-02 07:59





Sonuçları kontrol etmek / boş / boş değil kontrol etmek için Laravel'de verilen birkaç yöntem vardır:

$result->isNotEmpty(); // True if result is not empty.
$result->isEmpty(); // True if result is empty.
$result->count(); // Return count of records in result.

2
2018-01-07 15:49





Laravel aslında sadece kullanarak bir koleksiyon döndürür Model::all(); Bir dizi istediğiniz bir koleksiyon istemediğiniz için bunu yazabilirsiniz. (array)Model::all(); daha sonra sonuçları döndürmek için array_filter kullanabilirsiniz

$models = (array)Model::all()
$models = array_filter($models);
if(empty($models))
{
 do something
}

bu da sizin gibi şeyler yapmanıza izin verecektir count().


0
2017-11-24 05:06



Bir koleksiyon olarak tutmak, aslında, geri dönen nesnelerin hala toplama cephesinde bir çok yararlı fonksiyonu devralabilmesi için elverişlidir. - Gokigooooks


------ ÇÖZÜLDÜ ------

Bu durumda iki cace için iki tür sayımı kontrol etmek istersiniz

dava 1:

eğer sonuç sadece bir kayıt içeriyorsa, başka bir kelime seçin: -> first ()

 if(count($result)){

       ...record is exist true...
  }

vaka 2:

eğer sonuç birden fazla satır içeren başka bir kelime içeriyorsa -> get () veya -> all ()

  if($result->count()) {

         ...record is exist true...
  }

0
2018-03-07 05:45





Yapabilirsin

$result = Model::where(...)->count(); 

sonuçları saymak için.

Ayrıca kullanabilirsiniz

if ($result->isEmpty()){}

sonucun boş olup olmadığını kontrol etmek için.


0
2018-04-01 06:30





Sanırım bir şey deniyorsun

  @if(!$result->isEmpty())
         // $result is not empty
    @else
        // $result is empty
    @endif

veya ayrıca kullanın

if (!$result) { }
if ($result) { } 

0
2018-06-30 10:29