WHERE complexe dans Laravel Eloquent : 4 méthodes avec exemples

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Comment construire un WHERE complexe dans Laravel Eloquent : 4 méthodes avec exemples

\n\n

Imaginez : vous développez une boutique en ligne avec Laravel. Vous devez trouver tous les produits qui coûtent entre 1000 et 5000 €, en stock, mais pas dans la catégorie "Soldes", et créés après le 1er janvier 2024. Comment faire en une seule requête sans sacrifier les performances ?

\n\n

Cette question est l'une des plus populaires sur Stack Overflow (des milliers de vues !). Et pour cause : savoir construire des conditions WHERE complexes dans Laravel Eloquent distingue un débutant d'un développeur professionnel.

\n\n

Dans cet article, je vais vous montrer 4 méthodes éprouvées pour créer des conditions WHERE multiples. Vous apprendrez quand utiliser les tableaux, quand utiliser les closures, comment grouper les conditions et comment éviter les injections SQL. C'est parti !

\n\n
\n\n

1. Méthode de base : tableau de conditions (pour les AND simples)

\n\n

Le cas le plus simple : toutes les conditions sont reliées par AND. Laravel permet de passer un simple tableau à where() :

\n\n
<?php\n\n// On veut trouver les utilisateurs actifs de France, créés en 2024\n$users = User::where([\n    ['status', '=', 'active'],\n    ['country', '=', 'France'],\n    ['created_at', '>=', '2024-01-01'],\n])->get();\n\n// SQL : SELECT * FROM users WHERE status = 'active' AND country = 'France' AND created_at >= '2024-01-01'
\n\n

Quand l'utiliser : quand vous avez 2 à 5 conditions simples avec l'opérateur = ou >. Le code reste lisible, mais peu flexible.

\n\n

Inconvénient : si vous devez mélanger AND et OR, le tableau ne convient pas.

\n\n

2. Chaînage des méthodes where() (pour les conditions dynamiques)

\n\n

C'est la méthode la plus populaire parmi les développeurs. Vous appelez simplement where() plusieurs fois à la suite :

\n\n
<?php\n\n$products = Product::where('price', '>', 1000)\n    ->where('price', '<', 5000)\n    ->where('in_stock', true)\n    ->where('category_id', '!=', 5)\n    ->get();\n\n// SQL : ... WHERE price > 1000 AND price < 5000 AND in_stock = 1 AND category_id <> 5
\n\n

Astuce : vous pouvez le combiner avec d'autres conditions :

\n\n
<?php\n\n// Condition "OU" dans le chaînage\n$orders = Order::where('status', 'paid')\n    ->orWhere('status', 'shipped')\n    ->where('total', '>', 100)  // Attention : cette condition s'applique au orWhere précédent !\n    ->get();\n\n// SQL : ... WHERE status = 'paid' OR (status = 'shipped' AND total > 100)
\n\n

⚠️ Important ! Dans le dernier exemple, where total > 100 s'applique uniquement à status = 'shipped'. Si vous voulez que les deux statuts aient total > 100, lisez le point suivant.

\n\n

3. Groupement des conditions avec des closures (AND + OR ensemble)

\n\n

Nous arrivons à l'outil le plus puissant. Quand vous devez créer un groupe de conditions entre parenthèses, utilisez une closure à l'intérieur de where() :

\n\n
<?php\n\n// Objectif : trouver les commandes avec le statut "paid" ou "shipped",\n// mais avec total > 100 dans les deux cas\n$orders = Order::where(function($query) {\n        $query->where('status', 'paid')\n              ->orWhere('status', 'shipped');\n    })\n    ->where('total', '>', 100)\n    ->get();\n\n// SQL : ... WHERE (status = 'paid' OR status = 'shipped') AND total > 100
\n\n

Maintenant les conditions sont correctement groupées ! Vous pouvez imbriquer des closures les unes dans les autres autant que nécessaire :

\n\n
<?php\n\n// Filtre complexe pour l'analyse\n$data = Sale::where('date', '>=', '2024-01-01')\n    ->where(function($q) {\n        $q->where('amount', '>', 10000)\n          ->orWhere('is_vip', true);\n    })\n    ->where(function($q) {\n        $q-&                

Blogs

Book Recommendations