Formation PUB030 : Laravel, 2019 Les requêtes avec Eloquent ORM

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

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. Le fonctionnement de firstOrFail() est semblable à celui de findOrFail() sauf qu'il retourne toujours un seul enregistrement plutôt qu'une collection.

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.

firstOrCreate()

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 :

Contrôleur Laravel (PHP)

$produit = Produit::firstOrCreate(['code' => $code]);

Cette ligne de code donne exactement la même chose que si on avait fait :

Ex :

Contrôleur Laravel (PHP)

$produit = Produit::where('code', $code)->first();

 

if (!$produit) {

    Produit::create([

        'code' => $code

    ]);

}

▼Publicité

Veuillez noter que le contenu de cette fiche vous est partagé à titre gracieux, au meilleur de mes connaissances et sans aucune garantie.
Merci de partager !
Soumettre