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 :
$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.
$produits = Produit::where('categorie_id', 3)->get();
Et pour trier le tout :
$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.
$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.
$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().
$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 :
$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 :
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() :
$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 :
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