Başlangıç ​​Koleksiyonu: Boş Sayma ve Algılama


272

Bu önemsiz bir soru olabilir, ancak Laravel'in dönen bir Koleksiyonun $result = Model::where(...)->get()boş olup olmadığını kontrol etmek ve öğelerin sayısını saymak için belirli bir yol önerdiğini merak ediyorum .

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

Yanıtlar:


581

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

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

Çünkü dd($result);fark etmezseniz Illuminate\Support\Collection, sonuç olmasa bile her zaman döndürüldüğünü fark edersiniz . Aslında kontrol ettiğiniz şey $a = new stdClass; if ($a) { ... }her zaman doğru olacaktır.

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

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

Ayrıca kullanabilirsiniz ->first()yerine ->get()ilk sırada bulunan modelinin veya bir örneği dönecektir sorgu oluşturucu üzerinde nullaksi. Veritabanından yalnızca bir sonuç gerekiyorsa veya bekliyorsanız bu yararlıdır.

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

Notlar / Referanslar

Bonus Bilgileri

Koleksiyon ve Sorgu Oluşturucu 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 ne üzerinde çalıştığınızı bilmek kafa karıştırıcı olabilir. Sorgu Oluşturucu, siz sorguyu yürütecek ve veritabanını vuracak bir yöntemi çağırana kadar temelde bir sorgu oluşturur (örn ->all() ->first() ->lists(). Ve diğerleri gibi belirli yöntemleri çağırdığınızda ). Bu yöntemler , birden çok sonuç varsa Query Builder'dan döndürülebilen nesne üzerinde de bulunur Collection. Hangi sınıfla çalıştığınızdan emin değilseniz, var_dump(User::all())hangi sınıfların gerçekten geri döndüğünü görmek için yapmayı ve denemeyi deneyin (get_class(...)). Collection sınıfının kaynak koduna göz atmanızı şiddetle tavsiye ederim, oldukça basit. Ardından Sorgu Oluşturucu'ya bakın ve işlev adlarındaki benzerlikleri görün ve veritabanına gerçekten ne zaman isabet ettiğini öğrenin.


4
thx, sadece sorgu çalıştırırsanız first(), sonuç farklıdır get(), !$resultboş sonuç olarak kontrol edilebilirnull
bitinn

2
@btinn yes - eğer yaptıysanız Model::first()- aslında sorgu oluşturucunun 'ilk' yöntemine etki eder ve koleksiyon DEĞİLDİR, bu nedenle veritabanından ilkini seçer - ancak Model::get()Illuminate \ Support örneğini döndürür \ Koleksiyon böylece yaptıysanız $r = Model::get()ve $r->first()o koleksiyondaki ilk öğeyi seçecektir.
Gary Green

Bu cevabın ele almadığı bir şey count($result)işe yarayıp yaramadığı; bu ayrıntıyı eklemek bir gelişme olacaktır.
Mark Amery

$ sonuç-> sayı ve sayı ($ sonuç) arasındaki fark nedir $ sonuç-> sayı tekrar veritabanına çarptı mı? Değilse, o zaman bunlar aynı sanırım!
Kamy D

2
@pathros Bunu yapmanın basit bir yolu yok. Bir foreachdöngü kullanarak koleksiyonun her üyesini yinelemeniz ve ardından bu denetimlerden birini kullanmanız gerekir (düşün:) count($collection->column).
PapaHotelPapa

71

Sanırım aradığınız:

$result->isEmpty()

Bu durumdan farklıdır empty($result), ki bu doğru olmayacaktır, çünkü sonuç boş bir koleksiyon olacaktır. Önerileriniz count($result)de iyi bir çözümdür. Dokümanlarda referans bulamıyorum


1
Yalnızca bir kişi $ collection-> sütunundaki gibi belirli bir sütunun (özellik) boş / boş olup olmadığını kontrol etmek istediğinizde ne olur?
Pathros

13

Yukarıda onaylanan yanıtı kabul ediyorum. Ama genellikle $results->isNotEmpty()aşağıda verilen yöntemi kullanıyorum .

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

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

Bu yöntemin 5.3 sürümünden itibaren var olduğunu unutmayın .


4

Laravel'de sonuç sayısını kontrol etmek / boş / boş değil kontrol etmek için çeşitli yöntemler 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.

4

Bence kullanmak daha iyi

$result->isEmpty();

Koleksiyon boşsa isEmpty yöntemi true değerini döndürür; aksi takdirde false döndürülür.


3

Bence böyle bir şey deniyorsun

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

veya ayrıca kullanın

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

2

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.


1

Laravel Belgelerine göre şu şekilde kullanabilirsiniz:

$result->isEmpty();

isEmptyYöntem döndürür truekoleksiyon boşsa; aksi takdirde falseiade edilir.


0

böylece Laravel aslında sadece Model::all(); bir dizi istediğiniz bir koleksiyonu istemediğinizde bir koleksiyon döndürür, böylece set yazabilirsiniz. (array)Model::all();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().


3
bir koleksiyon olarak tutmak aslında uygundur, böylece döndürülen nesneler hala toplama cephesinde birçok yararlı işlevi devralabilir.
Gokigooooks

0

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

bu durumda iki hız için iki tür sayımı kontrol etmek istersiniz

dava 1:

sonuç yalnızca bir kayıt içeriyorsa başka bir kelime -> ilk () kullanarak veritabanından tek satır seçin

 if(count($result)){
     
       ...record is exist true...
  }

durum 2:

sonuç -> get () veya -> all () kullanarak başka bir kelime kümesi içeriyorsa

  if($result->count()) {
    
         ...record is exist true...
  }

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.