Conditions
Pour ajouter une clause WHERE à une requête dynamique, utilisez la méthode condition() :
$query->condition('bundle', 'article', '=');
Le code ci-dessus indique à la requête de filtrer les résultats pour le type de contenu « article ». Notez que le nom du champ ici doit être un alias créé par les méthodes addField() ou addExpression().
Paramètres de Condition
La méthode condition() prend trois paramètres :
- $field – le champ à comparer (obligatoire).
- $value – la valeur à comparer (optionnel, par défaut NULL).
- $operator – l’opérateur de comparaison (optionnel, par défaut ‘=’).
Opérateurs pris en charge
Les opérateurs de comparaison généraux '=', '<>', '<', '<=', '>', '>=' sont pris en charge par tous les types de bases de données supportés.
Utilisation de IN, NOT IN
Les opérateurs IN et NOT IN acceptent un tableau dans $value et comparent la valeur du champ aux valeurs du tableau.
$users = [2,5,17,22]; $query->condition('uid', $users, 'IN');
Dans cet exemple, la requête retournera les enregistrements dont uid est égal à 2, 5, 17 ou 22.
Utilisation de BETWEEN et NOT BETWEEN
Les opérateurs BETWEEN et NOT BETWEEN acceptent un tableau de deux valeurs pour la comparaison.
$query->condition('count', [5,10], 'BETWEEN');
Dans cet exemple, la requête retournera les enregistrements avec une valeur entre 5 et 10 inclus.
Utilisation de IS NULL, IS NOT NULL, EXISTS, et NOT EXISTS
Par convention, utilisez les méthodes suivantes au lieu d’utiliser condition() :
$query->isNull($field); $query->isNotNull($field); $query->exists($field); $query->notExists($field);
Bien qu’une condition comme $query->condition($field, NULL, 'IS NOT NULL') puisse fonctionner, la convention ci-dessus est recommandée.
Autres opérateurs
D’autres opérateurs, tels que BINARY ou d’autres spécifiques au système de base de données utilisé, peuvent fonctionner ou non. Gardez cela en tête lors du développement de modules destinés à être utilisés sur plusieurs systèmes.
Utilisation de plusieurs conditions
Vous pouvez ajouter plusieurs appels à condition() pour filtrer davantage la requête.
$query->condition('bundle', 'article', '='); $query->condition('status', 1, '=');
Si plusieurs conditions sont présentes, comme dans l’exemple ci-dessus, toutes les conditions doivent être remplies pour qu’un enregistrement apparaisse dans le résultat (c’est-à-dire que les conditions sont combinées avec AND).
Astuce : Pour obtenir une requête avec uniquement des conditions OR, utilisez une orConditionGroup.
Groupes de conditions
Les groupes de conditions permettent de créer des expressions WHERE plus complexes (incluant OR) dans une clause de requête. Il existe deux types de groupes :
- orConditionGroup – retourne un objet conditions combinées avec OR
- andConditionGroup – retourne un objet conditions combinées avec AND
Les groupes de conditions retournent un objet que vous pouvez ensuite ajouter comme condition à la requête.
// Création du groupe orConditionGroup $orGroup = $query->orConditionGroup() ->condition('promoted', 1) ->condition('uid', [2,4,7,22], 'IN'); // Ajout du groupe à la requête. $query->condition($orGroup);
Dans cet exemple, les conditions pour promoted et uid sont ajoutées dans la clause WHERE, regroupées avec un OR. Cela donnera une clause WHERE ressemblant à :
WHERE (promoted = 1 OR uid IN (2,4,7,22))
Vous pouvez ajouter plusieurs groupes orConditionGroup et andConditionGroup si nécessaire. Les groupes de conditions peuvent être imbriqués pour répondre à des besoins plus complexes dans la clause WHERE.
Voici un exemple de clause WHERE :
WHERE (a = 1 OR b = 1) AND ((c = 1 AND d = 1) OR (e = 1))
Les conditions de la requête peuvent être écrites avec des groupes de conditions comme suit :
$orGroup1 = $query->orConditionGroup() ->condition('a', 1) ->condition('b', 1); $andGroup1 = $query->andConditionGroup() ->condition('c', 1) ->condition('d', 1); $orGroup2 = $query->orConditionGroup() ->condition($andGroup1) ->condition('e', 1); $query->condition($orGroup1); $query->condition($orGroup2);