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

18.3 Retrouver les enregistrements correspondant à une condition : where() ou orWhere(), suivi de get()


Si vous désirez rechercher un enregistrement à l'aide d'un champ différent de son identifiant (ex : retrouver un usager par son code unique plutôt que par son identifiant) ou encore si vous recherchez les enregistrements correspondant à une condition (ex : tous les produits dont le prix est inférieur à 10$), la méthode where() sera votre alliée.

Lorsque vous effectuez une requête avec la méthode where(), vous recevez en retour une instance de la classe Illuminate\Database\Eloquent\Builder. Ceci est intéressant puisque cela vous permet de chaîner plusieurs appels à where() ainsi qu'à d'autres méthodes. Mais à ce stade, la requête à la base de données n'est pas encore effectuée alors il faudra ajouter une méthode terminale pour indiquer à Eloquent qu'il doit lancer la requête.

La méthode get() est généralement utilisée afin de transformer le résultat en collection.

Ex :

Contrôleur Laravel (PHP)

$produits = Produit::where('prix', '<', 10)->get();

Lorsque la relation entre le champ et la valeur est une égalité, il est possible de passer seulement les deux opérandes en paramètre.

Contrôleur Laravel (PHP)

$produits = Produit::where('categorie_id', 3)->get();

Et pour trier le tout :

Contrôleur Laravel (PHP)

$produits = Produit::where('categorie_id', 3)

    ->orderBy('description', 'asc')

    ->get();

Spécifier les champs à retourner

Par défaut, lorsqu'on lance une requête, on recevra tous les champs des enregistrements trouvés. Il est possible de préciser les champs désirés en fournissant un paramètre à la méthode get().

Ce paramètre est un tableau contenant le nom de chacun des champs désirés.

Contrôleur Laravel (PHP)

$produits = Produit::where('categorie_id', 3)

    ->orderBy('description', 'asc')

    ->get(['code', 'description']);

Requête avec plusieurs conditions (AND)

Il est possible d'enchaîner plusieurs méthodes where() pour assurer que la requête réponde à plusieurs conditions.

Lorsque la requête utilise plusieurs where(), c'est comme s'il y avait un AND entre chacune des conditions.

Contrôleur Laravel (PHP)

$produits = Produit::where('categorie_id', 3)

    ->where('prix', '<', 10)

    ->orderBy('description', 'asc')

    ->get();

Requête avec plusieurs conditions (OR)

Il est possible de spécifier deux conditions avec un OR en utilisant orWhere().

Contrôleur Laravel (PHP)

$produits = Produit::where('categorie_id', 3)

    ->orWhere('categorie_id', 8)

    ->orderBy('description', 'asc')

    ->get();

Résultats avec ou sans get()

Pour bien illustrer le rôle du get() à la fin de la requête, tentons l'instruction suivante :

Contrôleur Laravel (PHP)

$produits = Produit::where('categorie_id', '1');

ddsafe($produits);

On obtient un objet de type Builder avec de nombreuses propriétés. Cependant, cet objet ne fournit pas encore les données recherchées :

Résultat à l'écran

Builder {#173 ▼

  #query: Builder {#172 ▼

    #connection: MySqlConnection {#168 ▶}

    #grammar: MySqlGrammar {#169 ▶}

    #processor: MySqlProcessor {#170}

    #bindings: array:6 [▶]

    +aggregate: null

    +columns: null

    +distinct: false

    +from: "chalets"

    +joins: null

    +wheres: array:1 [▶]

    +groups: null

    +havings: null

    +orders: null

    +limit: null

    +offset: null

    +unions: null

    +unionLimit: null

    +unionOffset: null

    +unionOrders: null

    +lock: null

    #backups: []

    #bindingBackups: []

    #operators: array:29 [▶]

    #useWritePdo: false

  }

  #model: Produit {#161 ▼

    #primaryKey: "id"

    #connection: null

    #table: null

    #keyType: "int"

    #perPage: 15

    +incrementing: true

    +timestamps: true

    #attributes: []

    #original: []

    #relations: []

    #hidden: []

    #visible: []

    #appends: []

    #fillable: []

    #guarded: array:1 [▶]

    #dates: []

    #dateFormat: null

    #casts: []

    #touches: []

    #observables: []

    #with: []

    +exists: false

    +wasRecentlyCreated: false

  }

  #eagerLoad: []

  #macros: []

  #onDelete: null

  #passthru: array:11 [▶]

  #scopes: []

  #removedScopes: []

}

Essayons maintenant avec un get() :

Contrôleur Laravel (PHP)

$produits = Produit::where('categorie_id', '1')->get();

ddsafe($produits);

Cette fois, on obtient une collection et on voit clairement le résultat de la requête :

Résultat à l'écran

Collection {#175 ▼

  #items: array:1 [▼

    0 => Produit {#177 ▼

      #primaryKey: "id"

      #connection: null

      #table: null

      #keyType: "int"

      #perPage: 15

      +incrementing: true

      +timestamps: true

      #attributes: array:6 [▼

        "id" => 1

        "code" => "BASI"

        "description" => "Basilic"

        "prix" => 3.5

        "categorie_id" => 1

        "created_at" => null

        "updated_at" => null

      ]

      #original: array:6 [▼

        "id" => 1

        "code" => "BASI"

        "description" => "Basilic"

        "prix" => 3.5

        "categorie_id" => 1

        "created_at" => null

        "updated_at" => null

      ]

      #relations: []

      #hidden: []

      #visible: []

      #appends: []

      #fillable: []

      #guarded: array:1 [▼

        0 => "*"

      ]

      #dates: []

      #dateFormat: null

      #casts: []

      #touches: []

      #observables: []

      #with: []

      +exists: true

      +wasRecentlyCreated: false

    }

  ]

}

Travailler avec des dates

Pour faciliter le travail avec des dates, Eloquent nous propose des fonctions qui extraient automatiquement le jour, le mois ou l'année d'une date : whereDate(), whereMonth(), whereDay(), whereYear() et whereTime().

Ainsi, pour retrouver tous les produits ajoutés dans le système cette année :

Contrôleur Laravel (PHP)

$produits = Produit::whereYear('created_at', date('Y'))->get();

Pour plus d'information

« Eloquent: Getting Started - Retrieving Models ». Laravel. https://laravel.com/docs/master/eloquent#retrieving-models

▼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