web-dev-qa-db-fra.com

Collection Eloquent: Compter et détecter les vides

Cette question est peut-être triviale, mais je me demande si Laravel recommande de vérifier si une collection Eloquent renvoyée par $result = Model::where(...)->get() est vide et compte le nombre d'éléments.

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

202
bitinn

Lorsque vous utilisez ->get(), vous ne pouvez pas utiliser simplement l’un des éléments suivants:

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

Parce que si vous dd($result);, vous remarquerez qu'une instance de Illuminate\Support\Collection est toujours renvoyée, même en l'absence de résultat. Ce que vous vérifiez essentiellement est $a = new stdClass; if ($a) { ... } qui retournera toujours true.

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 ->first() au lieu de ->get() dans le générateur de requêtes qui renverra une instance du premier modèle trouvé, ou null sinon. Ceci est utile si vous avez besoin ou attendez 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 entre Collection et Query Builder peuvent être un peu déroutantes pour les nouveaux arrivants 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 Générateur de requêtes crée essentiellement une requête jusqu'à ce que vous appeliez une méthode où il l'exécutera et frappera la base de données (par exemple, lorsque vous appelez certaines méthodes telles que ->all()->first()->lists() et d'autres). Ces méthodes aussi existent sur l'objet Collection, qui peut être renvoyé par le Générateur de requêtes s'il existe plusieurs résultats. Si vous n'êtes pas sûr de la classe avec laquelle vous travaillez, essayez d'utiliser var_dump(User::all()) et d'essayer de voir quelles classes elle renvoie réellement (à l'aide de get_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 observez les similitudes dans les noms de fonctions et découvrez à quel moment il atteint la base de données.

450
Gary Green

Je pense que vous recherchez:

$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 de count($result) est également une bonne solution. Je ne trouve aucune référence dans la documentation

56
clod986

Je suis d'accord avec la réponse approuvée ci-dessus. Mais d'habitude j'utilise la méthode $results->isNotEmpty() comme indiqué ci-dessous.

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

C'est plus verbeux que if(!results->isEmpty()) car nous oublions parfois d'ajouter '!' devant qui peut entraîner une erreur non désirée.

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

7
sathish R

Je pense mieux utiliser

$result->isEmpty();

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

2
Jignesh Joisar

Laravel propose plusieurs méthodes pour vérifier les résultats: count/check vide/not empty:

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

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

Tu peux faire 

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

compter les résultats. 

Vous pouvez aussi utiliser 

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

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

1
PatrickL

------ RESOLU ------

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

cas 1:

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

 if(count($result)){

       ...record is exist true...
  }

cas 2:

si le résultat contient un ensemble de plusieurs lignes que Word utilise -> get () ou -> all ()

  if($result->count()) {

         ...record is exist true...
  }
0

donc Laravel renvoie réellement une collection en utilisant simplement Model::all();vous ne voulez pas d'une collection mais d'un tableau pour pouvoir taper set it .(array)Model::all(); puis vous pouvez utiliser array_filter pour renvoyer 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().

0
Benjamin Sweetnam

Selon Laravel Documentation , vous pouvez utiliser cette méthode: 

$result->isEmpty();

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

0
Udhav Sarvaiya