Conserver la première occurence : first() ou firstOrFail()

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é.

▼Publicité

Pour y parvenir, on remplacera l'appel à get() par un appel à first().

Ex :

Contrôleur Laravel (PHP)

$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 :

Résultat à l'écran

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.

firstOrFail()

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.

Ex :

Contrôleur Laravel (PHP)

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.

Merci de partager ! Share on FacebookTweet about this on TwitterShare on Google+Share on LinkedInPin on PinterestShare on StumbleUponEmail this to someone
Catégories