Sous Laravel, une requête Eloquent qui utilise un where() suivi d'un get() retournera toujours une collection. Ce sera le cas même lorsque la recherche se fait sur un champ qui a un index unique. Il faudra donc ajuster la requête afin que seul le premier enregistrement trouvé soit conservé.
Pour y parvenir, on remplacera l'appel à get() par un appel à first().
Ex :
$usager = Usager::where('code', $code)->first();
// toujours vérifier si l'enregistrement a été trouvé
if (isset($usager)) {
...
}
Cette fois, on obtient une instance de la classe Usager et non une collection, tel que démontré par le dump and die :
Usager {#177 ▼
#primaryKey: "id"
#connection: null
#table: null
#keyType: "int"
#perPage: 15
+incrementing: true
+timestamps: true
#attributes: array:10 [▼
"id" => 1
"nomfamille" => "Gagnon"
"prenom" => "Annie"
...
"created_at" => null
"updated_at" => null
]
#original: array:10 [▶]
#relations: []
#hidden: []
#visible: []
#appends: []
#fillable: []
#guarded: array:1 [▶]
#dates: []
#dateFormat: null
#casts: []
#touches: []
#observables: []
#with: []
+exists: true
+wasRecentlyCreated: false
}
Attention : dans le cas où aucun enregistrement ne correspondrait au where(), l'utilisation de first() donnera un résultat nul. Il est donc important de vérifier si la variable est initialisée avant de poursuivre.
Il est également possible de travailler avec la méthode firstOrFail(). Avec cette méthode, si aucun enregistrement ne correspond à la condition spécifiée, une exception de type ModelNotFoundException sera levée. Le fonctionnement de firstOrFail() est semblable à celui de findOrFail() sauf qu'il retourne toujours un seul enregistrement plutôt qu'une collection.
Ex :
try {
$usager = Usager::where('code', $code)->firstOrFail();
...
}
catch (\Illuminate\Database\Eloquent\ModelNotFoundException $e) {
...
}
catch (\Throwable $e) {
\Log::error('Erreur inattendue : ', [$e]);
...
}
Si on omet le try...catch et que l'enregistrement recherché n'est pas trouvé, Laravel récupérera l'exception en générant une erreur 404.
Avez-vous déjà eu à programmer une fonctionnalité qui devait vérifier si un enregistrement existe et le créer dans le cas où il n'existe pas ? Laravel vous offre la fonction firstOrCreate() pour vous simplifier la vie.
Ex :
$produit = Produit::firstOrCreate(['code' => $code]);
Cette ligne de code donne exactement la même chose que si on avait fait :
Ex :
$produit = Produit::where('code', $code)->first();
if (!$produit) {
Produit::create([
'code' => $code
]);
}
▼Publicité