Laravel : 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.

▼Publicité

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');

ddd($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();

ddd($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

    }

  ]

}

Pour plus d'information

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

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

Laisser un commentaire

9 + 2 =