Koleksi Eloquent: Menghitung dan Mendeteksi Kosong

272

Ini mungkin pertanyaan sepele, tetapi saya bertanya-tanya apakah Laravel merekomendasikan cara tertentu untuk memeriksa apakah koleksi Eloquent yang dikembalikan dari $result = Model::where(...)->get()kosong, serta menghitung jumlah elemen.

Kami sedang menggunakan !$resultuntuk mendeteksi hasil kosong, apakah itu cukup? Adapun count($result), apakah itu benar-benar mencakup semua kasus, termasuk hasil kosong?

bitinn
sumber

Jawaban:

581

Saat menggunakan ->get()Anda tidak bisa hanya menggunakan salah satu di bawah ini:

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

Karena jika Anda dd($result);akan melihat contoh Illuminate\Support\Collectionselalu dikembalikan, bahkan ketika tidak ada hasil. Pada dasarnya apa yang Anda periksa adalah $a = new stdClass; if ($a) { ... }yang akan selalu kembali benar.

Untuk menentukan apakah ada hasil yang dapat Anda lakukan salah satu dari yang berikut:

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

Anda juga bisa menggunakan ->first()alih-alih ->get()pada pembuat kueri yang akan mengembalikan instance dari model yang ditemukan pertama kali, atau nullsebaliknya. Ini berguna jika Anda membutuhkan atau hanya mengharapkan satu hasil dari database.

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

Catatan / Referensi

Informasi Bonus

Perbedaan Kumpulan dan Pembuat Kueri dapat sedikit membingungkan bagi pendatang baru Laravel karena nama metode sering sama di antara keduanya. Untuk alasan itu bisa membingungkan untuk mengetahui apa yang sedang Anda kerjakan. Query Builder pada dasarnya membangun kueri sampai Anda memanggil metode di mana ia akan mengeksekusi kueri dan menekan database (mis. Ketika Anda memanggil metode tertentu seperti ->all() ->first() ->lists()dan yang lain). Metode-metode itu juga ada pada Collectionobjek, yang bisa dikembalikan dari Pembuat Kueri jika ada beberapa hasil. Jika Anda tidak yakin kelas apa yang sedang Anda kerjakan, coba lakukan var_dump(User::all())dan bereksperimen untuk melihat kelas apa yang sebenarnya dikembalikan (dengan bantuanget_class(...)). Saya sangat menyarankan Anda memeriksa kode sumber untuk kelas Koleksi, sangat sederhana. Kemudian periksa Pembuat Kueri dan lihat persamaan dalam nama fungsi dan cari tahu kapan itu benar-benar menyentuh database.

Gary Green
sumber
4
thx, hanya untuk menambahkan bahwa jika Anda menjalankan kueri first(), hasilnya berbeda dari get(), yang dapat diperiksa dengan !$resulthasil kosongnull
bitinn
2
@ btinn ya - jika Anda melakukannya yaitu Model::first()- itu sebenarnya bekerja pada metode 'pertama` pembuat kueri dan BUKAN koleksi, oleh karena itu akan memilih yang pertama dari database - namun Model::get()akan mengembalikan instance dari Illuminate \ Support \ Koleksi jadi jika Anda melakukannya $r = Model::get()dan kemudian $r->first()akan memilih item pertama dalam koleksi itu.
Gary Green
Satu hal yang tidak dijawab oleh jawaban ini adalah apakah count($result)berhasil; menambahkan detail itu akan menjadi peningkatan.
Mark Amery
apa perbedaan antara $ result-> count dan count ($ result) Apakah $ result-> count mencapai database lagi? Jika tidak, saya kira ini sama saja!
Kamy D
2
@pathros Tidak ada cara sederhana untuk melakukan itu. Anda harus mengulangi melalui setiap anggota koleksi menggunakan foreachloop dan kemudian menggunakan salah satu dari cek ini (pikirkan count($collection->column):).
PapaHotelPapa
71

Saya pikir Anda mencari:

$result->isEmpty()

Ini berbeda dari empty($result), yang tidak akan benar karena hasilnya akan menjadi koleksi kosong. Saran Anda count($result)juga merupakan solusi yang baik. Saya tidak dapat menemukan referensi di dokumen

clod986
sumber
1
Bagaimana kalau Anda hanya ingin memeriksa apakah kolom tertentu (properti) seperti di $ collection-> kolom kosong / nol atau tidak?
Pathros
13

Saya menyetujui jawaban yang disetujui di atas. Tapi biasanya saya menggunakan $results->isNotEmpty()metode seperti yang diberikan di bawah ini.

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

Ini lebih bertele-tele daripada if(!results->isEmpty())karena terkadang kita lupa menambahkan '!' di depan yang dapat menyebabkan kesalahan yang tidak diinginkan.

Perhatikan bahwa metode ini ada dari versi 5.3 dan seterusnya.

sathish R
sumber
4

Ada beberapa metode yang diberikan di Laravel untuk memeriksa hasil menghitung / memeriksa kosong / tidak kosong:

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

Saya pikir lebih baik digunakan

$result->isEmpty();

Metode isEmpty mengembalikan true jika koleksi kosong; jika tidak, false dikembalikan.

Jignesh Joisar
sumber
3

Saya pikir Anda mencoba sesuatu seperti

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

atau juga gunakan

if (!$result) { }
if ($result) { } 
pardeep
sumber
2

Anda dapat melakukan

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

untuk menghitung hasilnya.

Anda juga bisa menggunakan

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

untuk memeriksa apakah hasilnya kosong atau tidak.

Patrick Lumenus
sumber
1

Menurut status Dokumentasi Laravel Anda dapat menggunakan cara ini:

$result->isEmpty();

The isEmptymetode kembali truejika koleksi kosong; jika tidak, falsedikembalikan.

Udhav Sarvaiya
sumber
0

jadi Laravel sebenarnya mengembalikan koleksi ketika hanya menggunakan Model::all(); Anda tidak ingin koleksi yang Anda inginkan array sehingga Anda dapat mengetik mengaturnya. (array)Model::all();maka Anda dapat menggunakan array_filter untuk mengembalikan hasilnya

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

ini juga akan memungkinkan Anda untuk melakukan hal-hal seperti count().

Benjamin Sweetnam
sumber
3
menjaganya sebagai koleksi sebenarnya nyaman sehingga objek yang dikembalikan masih bisa mewarisi banyak fungsi yang berguna dalam fasad koleksi.
Gokigooooks
0

------TERPECAHKAN------

dalam hal ini Anda ingin memeriksa dua jenis hitungan untuk dua cace

kasus 1:

jika hasilnya hanya berisi satu catatan kata lain pilih satu baris dari basis data menggunakan -> first ()

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

kasus 2:

jika hasilnya berisi kumpulan beberapa baris kata lain menggunakan -> get () atau -> semua ()

  if($result->count()) {
    
         ...record is exist true...
  }
Ravindra Bhanderi
sumber
0

Kamu bisa memakai: $counter = count($datas);

nazmulhaqued
sumber