Collezione eloquente: contare e rilevare vuoti


272

Questa può essere una domanda banale, ma mi chiedo se Laravel raccomanda un certo modo per verificare se una collezione di Eloquent restituita $result = Model::where(...)->get()è vuota, oltre a contare il numero di elementi.

Attualmente stiamo usando !$resultper rilevare risultati vuoti, è sufficiente? Per quanto riguarda count($result), copre effettivamente tutti i casi, incluso il risultato vuoto?

Risposte:


581

Quando si utilizza ->get()non è possibile utilizzare semplicemente uno dei seguenti:

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

Perché se dd($result);noterai che Illuminate\Support\Collectionviene sempre restituita un'istanza di , anche quando non ci sono risultati. In sostanza ciò che stai controllando è $a = new stdClass; if ($a) { ... }che tornerà sempre vero.

Per determinare se ci sono risultati è possibile effettuare una delle seguenti operazioni:

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

È inoltre possibile utilizzare ->first()anziché ->get()sul generatore di query che restituirà un'istanza del primo modello trovato o in nullaltro modo. Ciò è utile se è necessario o si prevede un solo risultato dal database.

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

Note / Riferimenti

Informazioni sul bonus

Le differenze di Collection e Query Builder possono essere un po 'confuse per i nuovi arrivati ​​di Laravel perché i nomi dei metodi sono spesso gli stessi tra i due. Per questo motivo può essere confuso sapere su cosa stai lavorando. Il Generatore di query crea essenzialmente una query fino a quando non si chiama un metodo in cui eseguirà la query e colpirà il database (ad esempio quando si chiamano determinati metodi come ->all() ->first() ->lists()e altri). Tali metodi esistono ancheCollection sull'oggetto, che può essere restituito dal Generatore di query in caso di più risultati. Se non sei sicuro di quale classe stai effettivamente lavorando, prova a fare var_dump(User::all())e sperimentare per vedere quali classi sta effettivamente tornando (con l'aiuto diget_class(...)). Consiglio vivamente di controllare il codice sorgente per la classe Collection, è piuttosto semplice. Quindi controlla Query Builder e vedi le somiglianze nei nomi delle funzioni e scopri quando colpisce effettivamente il database.


4
grazie, solo per aggiungere che se si esegue la query first(), il risultato è diverso da get(), che può essere verificato con !$resultil risultato vuoto ènull
bitinn

2
@btinn sì - se lo hai fatto cioè Model::first()- agisce effettivamente sul metodo "first" del generatore di query e NON sulla raccolta, quindi sceglierà il primo dal database - tuttavia Model::get()restituirà un'istanza di Illuminate \ Support \ collezione quindi se si ha fatto $r = Model::get()e poi $r->first()si riprenderà il primo elemento all'interno di tale raccolta.
Gary Green,

Una cosa che questa risposta non affronta è se count($result)funziona; aggiungendo quel dettaglio sarebbe un miglioramento.
Mark Amery,

qual è la differenza tra $ result-> count e count ($ result) $ result-> count colpisce di nuovo il database? Altrimenti, immagino che siano gli stessi allora!
Kamy D,

2
@pathros Non esiste un modo semplice per farlo. Dovresti iterare attraverso ogni membro della raccolta usando un foreachciclo e quindi usare uno di questi controlli (pensa:) count($collection->column).
PapaHotelPapa,

71

Penso che tu stia cercando:

$result->isEmpty()

Questo è diverso da empty($result), il che non sarà vero perché il risultato sarà una raccolta vuota. Anche il tuo suggerimento count($result)è una buona soluzione. Non riesco a trovare alcun riferimento nei documenti


1
Che ne dici di quando vuoi controllare se una specifica colonna (proprietà) come in $ collection-> è vuota / nulla o no?
Pathros,

13

Accetto la risposta approvata sopra. Ma di solito uso il $results->isNotEmpty()metodo come indicato di seguito.

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

È più prolisso che if(!results->isEmpty())perché a volte ci dimentichiamo di aggiungere '!' davanti che può causare errori indesiderati.

Si noti che questo metodo esiste dalla versione 5.3 in poi.


4

Esistono diversi metodi forniti in Laravel per controllare il conteggio dei risultati / controllare vuoto / non vuoto:

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

4

Penso che sia meglio usarlo

$result->isEmpty();

Il metodo isEmpty restituisce true se la raccolta è vuota; in caso contrario, viene restituito falso.


3

Penso che provi qualcosa del genere

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

o anche usare

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

2

Tu puoi fare

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

per contare i risultati.

Puoi anche usare

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

per verificare se il risultato è vuoto o meno.


1

Secondo la documentazione di Laravel afferma che è possibile utilizzare in questo modo:

$result->isEmpty();

Il isEmptymetodo restituisce truese la raccolta è vuota; in caso contrario, falseviene restituito.


0

quindi Laravel restituisce effettivamente una raccolta quando solo usando Model::all(); non vuoi una raccolta, vuoi un array in modo da poterlo digitare. (array)Model::all();quindi è possibile utilizzare array_filter per restituire i risultati

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

questo ti permetterà anche di fare cose del genere count().


3
tenerlo come una raccolta è effettivamente conveniente in modo che gli oggetti restituiti possano ancora ereditare molte funzioni utili nella facciata della raccolta.
Gokigooooks

0

------ ------ RISOLTO

in questo caso si desidera controllare due tipi di conteggio per due cace

caso 1:

se il risultato contiene solo un record di un'altra parola, selezionare una riga dal database usando -> first ()

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

caso 2:

se il risultato contiene un set di più righe di altre parole usando -> get () o -> all ()

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.