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();
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']);
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();
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();
Pour bien illustrer le rôle du get() à la fin de la requête, tentons l'instruction suivante :
$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 :
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();
ddsafe($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 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 :
$produits = Produit::whereYear('created_at', date('Y'))->get();
« Eloquent: Getting Started - Retrieving Models ». Laravel. https://laravel.com/docs/master/eloquent#retrieving-models
▼Publicité