Collezione eloquente: contare e rilevare vuoti

Questa forse è una domanda banale, ma mi chiedo se Laravel ti consiglia un certo modo per verificare se una raccolta Eloquent restituita da $result = Model::where(...)->get() è vuota, così come il conteggio del numero di elementi.

Attualmente stiamo usando !$result per rilevare risultati vuoti, è sufficiente? Per quanto riguarda il count($result) , in realtà copre tutti i casi, compreso il risultato vuoto?

Quando usi ->get() non puoi semplicemente usare uno dei seguenti:

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

Perché se tu dd($result); noterai che un’istanza di Illuminate\Support\Collection viene sempre restituita, anche quando non ci sono risultati. In sostanza quello che stai controllando è $a = new stdClass; if ($a) { ... } $a = new stdClass; if ($a) { ... } che restituirà sempre true.

Per determinare se ci sono dei risultati, puoi eseguire una delle seguenti azioni:

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

Puoi anche usare ->first() invece di ->get() sul generatore di query che restituirà un’istanza del primo modello trovato, altrimenti null . Questo è utile se hai bisogno o ti aspetti un solo risultato dal database.

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

Note / riferimenti

Informazioni bonus

Le differenze di Collection e Query Builder possono essere un po ‘di confusione per i nuovi arrivati ​​di Laravel perché i nomi dei metodi sono spesso gli stessi tra i due. Per questo motivo può essere fonte di confusione sapere su cosa stai lavorando. Il Generatore di query essenzialmente costruisce una query fino a quando non chiami un metodo in cui eseguirà la query e colpirà il database (ad esempio, quando chiami determinati metodi come ->all() ->first() ->lists() e altri). Questi metodi esistono anche sull’object Collection , che può essere restituito dal Generatore di query se vi sono più risultati. Se non sei sicuro di quale class stai effettivamente lavorando, prova a fare var_dump(User::all()) e sperimentare per vedere quali classi sta effettivamente restituendo (con l’aiuto di get_class(...) ). Consiglio vivamente di controllare il codice sorgente per la class Collection, è piuttosto semplice. Quindi controlla il generatore di query e vedi le somiglianze nei nomi delle funzioni e scopri quando effettivamente colpisce il database.

  • Laravel 5.2 Collection Class
  • Query Builder di Laravel 5.2

Penso che tu stia cercando:

 $result->isEmpty() 

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

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

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

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

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

Ci sono diversi metodi dati 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. 

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) { } 

quindi Laravel restituisce effettivamente una raccolta usando solo Model::all(); non vuoi una collezione vuoi un array così puoi digitare impostarlo. (array)Model::all(); allora puoi usare 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 come count() .

—— —— RISOLTO

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

caso 1:

se il risultato contiene solo un record, un’altra parola seleziona una riga singola dal database usando -> first ()

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

caso 2:

se il risultato contiene un insieme di più righe un’altra parola usando -> get () o -> all ()

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

Tu puoi fare

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

per contare i risultati.

Puoi anche usare

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

per verificare se il risultato è o meno vuoto.