Collection Eloquent: comptage et détection de vide

272

Cela peut être une question triviale mais je me demande si Laravel recommande une certaine façon de vérifier si une collection Eloquent retournée $result = Model::where(...)->get()est vide, ainsi que de compter le nombre d'éléments.

Nous utilisons actuellement !$resultpour détecter un résultat vide, est-ce suffisant? Quant à count($result), couvre-t-il réellement tous les cas, y compris le résultat vide?

bitinn
la source

Réponses:

581

Lors de l'utilisation, ->get()vous ne pouvez pas simplement utiliser l'un des éléments suivants:

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

Parce que si vous dd($result);remarquez qu'une instance de Illuminate\Support\Collectionest toujours renvoyée, même en l'absence de résultats. Essentiellement, ce que vous vérifiez, c'est $a = new stdClass; if ($a) { ... }ce qui restera toujours vrai.

Pour déterminer s'il existe des résultats, vous pouvez effectuer l'une des opérations suivantes:

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

Vous pouvez également utiliser à la ->first()place de ->get()sur le générateur de requêtes qui retournera une instance du premier modèle trouvé, ou nullautrement. Ceci est utile si vous avez besoin ou n'attendez qu'un seul résultat de la base de données.

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

Notes / Références

Informations sur les bonus

Les différences Collection et Query Builder peuvent être un peu déroutantes pour les nouveaux venus de Laravel car les noms de méthode sont souvent les mêmes entre les deux. Pour cette raison, il peut être déroutant de savoir sur quoi vous travaillez. Le Query Builder construit essentiellement une requête jusqu'à ce que vous appeliez une méthode où il exécutera la requête et frappera la base de données (par exemple lorsque vous appelez certaines méthodes comme ->all() ->first() ->lists()et d'autres). Ces méthodes existent également sur l' Collectionobjet, qui peut être renvoyé par le générateur de requêtes s'il existe plusieurs résultats. Si vous ne savez pas avec quelle classe vous travaillez réellement, essayez de faire var_dump(User::all())et d'expérimenter pour voir quelles classes il retourne réellement (avec l'aide deget_class(...)). Je vous recommande fortement de consulter le code source de la classe Collection, c'est assez simple. Ensuite, consultez le Générateur de requêtes et voyez les similitudes dans les noms de fonction et découvrez quand il atteint réellement la base de données.

Gary Green
la source
4
thx, juste pour ajouter que si vous exécutez une requête first(), le résultat est différent de get(), ce qui peut être vérifié avec !$resultcomme résultat vide estnull
bitinn
2
@btinn yes - si vous l'avez fait, c'est-à-dire Model::first()qu'il agit en fait sur la "première" méthode du générateur de requêtes et NON sur la collection, donc il choisira la première de la base de données - mais Model::get()retournera une instance de Illuminate \ Support \ Collection donc si vous l'avez fait $r = Model::get()et ensuite $r->first()il sélectionnera le premier élément de cette collection.
Gary Green
Une chose que cette réponse ne traite pas est de savoir si cela count($result)fonctionne; l'ajout de ce détail serait une amélioration.
Mark Amery
Quelle est la différence entre $ result-> count et count ($ result) $ result-> count at-il de nouveau atteint la base de données? Sinon, je suppose que ce sont les mêmes alors!
Kamy D du
2
@pathros Il n'y a pas de moyen simple de le faire. Vous devez parcourir chaque membre de la collection à l'aide d'une foreachboucle, puis utiliser l'une de ces vérifications (pensez:) count($collection->column).
PapaHotelPapa
71

Je pense que vous cherchez:

$result->isEmpty()

Ceci est différent de empty($result), ce qui ne sera pas vrai car le résultat sera une collection vide. Votre suggestion count($result)est également une bonne solution. Je ne trouve aucune référence dans la documentation

clod986
la source
1
Qu'en est-il lorsque vous ne voulez vérifier qu'une colonne (propriété) spécifique comme dans la collection $ collection-> est vide / nulle ou non?
Pathros
13

J'accepte la réponse approuvée ci-dessus. Mais généralement j'utilise la $results->isNotEmpty()méthode indiquée ci-dessous.

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

C'est plus verbeux que if(!results->isEmpty())parce que parfois on oublie d'ajouter '!' devant ce qui peut entraîner une erreur indésirable.

Notez que cette méthode existe à partir de la version 5.3 .

sathish R
la source
4

Il existe plusieurs méthodes données dans Laravel pour vérifier le nombre de résultats / vérifier vide / non vide:

$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
la source
4

Je pense qu'il vaut mieux utiliser

$result->isEmpty();

La méthode isEmpty renvoie true si la collection est vide; sinon, false est retourné.

Jignesh Joisar
la source
3

Je pense que vous essayez quelque chose comme

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

ou aussi utiliser

if (!$result) { }
if ($result) { } 
pardeep
la source
2

Tu peux faire

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

compter les résultats.

Vous pouvez aussi utiliser

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

pour vérifier si le résultat est vide ou non.

Patrick Lumenus
la source
1

Selon la documentation de Laravel , vous pouvez utiliser cette méthode:

$result->isEmpty();

La isEmptyméthode retourne truesi la collection est vide; sinon, falseest retourné.

Udhav Sarvaiya
la source
0

donc Laravel retourne en fait une collection lorsque Model::all(); vous l' utilisez, vous ne voulez pas une collection, vous voulez un tableau, vous pouvez donc taper set. (array)Model::all();alors vous pouvez utiliser array_filter pour retourner les résultats

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

cela vous permettra également de faire des choses comme count().

Benjamin Sweetnam
la source
3
le conserver en tant que collection est en fait pratique pour que les objets retournés puissent encore hériter de nombreuses fonctions utiles dans la façade de la collection.
Gokigooooks le
0

------ RÉSOLU ------

dans ce cas, vous voulez vérifier deux types de comptage pour deux cace

cas 1:

si le résultat contient un seul enregistrement autre mot sélectionner une seule ligne de la base de données en utilisant -> first ()

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

cas 2:

si le résultat contient un ensemble de plusieurs lignes, un autre mot utilisant -> get () ou -> all ()

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

Vous pouvez utiliser: $counter = count($datas);

nazmulhaqued
la source