Comment créer des requêtes avec des conditions WHERE multiples dans Laravel Eloquent
Avez-vous déjà pensé : « Je dois filtrer des enregistrements selon trois conditions différentes, mais la syntaxe d'Eloquent est un peu confuse » ? Si oui, vous n'êtes pas seul. La question "How to Create Multiple Where Clause Query Using Laravel Eloquent?" sur Stack Overflow a recueilli des milliers de vues, et ce n'est pas surprenant. Travailler avec une base de données est le cœur de toute application PHP, et la capacité à construire des requêtes complexes distingue le débutant du professionnel.
Dans cet article, nous allons examiner toutes les façons de créer des conditions WHERE multiples dans Laravel Eloquent : des chaînes les plus simples aux constructions logiques imbriquées. Vous apprendrez à combiner AND et OR, à utiliser whereHas pour les modèles associés et à éviter les erreurs typiques. C'est parti !
Syntaxe de base : chaîne WHERE
La façon la plus évidente d'ajouter plusieurs conditions est simplement d'appeler where() plusieurs fois de suite. Par défaut, toutes les conditions sont reliées par AND.
// Obtenir tous les utilisateurs dont status = 'active' ET role = 'admin'$users = User::where('status', 'active') ->where('role', 'admin') ->get();
// SQL équivalent :// SELECT * FROM users WHERE status = 'active' AND role = 'admin'On peut passer un tableau de conditions :
$users = User::where([ ['status', '=', 'active'], ['role', '=', 'admin'],])->get();Les deux options fonctionnent, mais la première est plus facile à lire, surtout lorsqu'il y a beaucoup de conditions.
Condition OR : quand il faut « ou »
Et si nous devons trouver des utilisateurs qui sont OU actifs, OU administrateurs ? C'est là qu'intervient orWhere().
// Utilisateurs dont status = 'active' OU role = 'admin'$users = User::where('status', 'active') ->orWhere('role', 'admin') ->get();
// SQL : SELECT * FROM users WHERE status = 'active' OR role = 'admin'⚠️ Avertissement important : Si vous mélangez where et orWhere, rappelez-vous de la priorité des opérateurs. Laravel les traite séquentiellement, donc le résultat peut différer de celui attendu.
Exemple avec un piège
// Nous voulons : (status = 'active' AND role = 'admin') OR (plan = 'premium')$users = User::where('status', 'active') ->where('role', 'admin') ->orWhere('plan', 'premium') ->get();
// SQL : WHERE status = 'active' AND role = 'admin' OR plan = 'premium'// Ce n'est PAS la même chose !Pour obtenir le résultat correct, utilisez le regroupement avec une fermeture :
$users = User::where(function ($query) { $query->where('status', 'active') ->where('role', 'admin');})->orWhere('plan', 'premium') ->get();
// SQL : WHERE (status = 'active' AND role = 'admin') OR plan = 'premium'WHERE imbriqués : regroupement de conditions
Lorsque la logique devient plus complexe, les fermetures imbriquées viennent à la rescousse. C'est l'outil le plus puissant pour créer des conditions complexes.
// (age > 18 AND status = 'active') OR (age <= 18 AND parent_approved = 1)$users = User::where(function ($query) { $query->where('age', '>', 18) ->where('status', 'active');})->orWhere(function ($query) { $query->where('age', '<=', 18) ->where('parent_approved', 1);})->get();Le code se lit comme un livre : « trouve les utilisateurs qui sont majeurs et actifs, OU mineurs avec approbation parentale ».
Conditions avec opérateurs : WHERE IN, BETWEEN, NULL
Eloquent prend en charge tous les opérateurs SQL standard. Voici quelques-uns utiles :
whereIn — vérification d'appartenance à une liste
<