Voorwaarden (Conditions)
Om een WHERE-clausule toe te voegen aan een dynamische query, gebruik je de methode condition():
$query->condition('bundle', 'article', '=');
Bovenstaande code instrueert de query om de resultaten te filteren op het bundletype article. Merk op dat de veldnaam hier een alias moet zijn die is aangemaakt met de methoden addField() of addExpression().
Parameters van condition()
De methode condition() accepteert drie parameters:
$field– het veld waarmee vergeleken wordt (verplicht).$value– de waarde waarmee vergeleken wordt (optioneel, standaardNULL).$operator– de vergelijkingsoperator (optioneel, standaard ‘=’).
Ondersteunde operatoren
De algemene vergelijkingsoperatoren '=', '<>', '<', '<=', '>', '>=' worden ondersteund in alle ondersteunde databasesystemen.
Gebruik van IN en NOT IN
De operatoren IN en NOT IN accepteren een array in $value en vergelijken de veldwaarde met de waarden in de array.
$users = [2,5,17,22];
$query->condition('uid', $users, 'IN');
In dit voorbeeld retourneert de query records waarbij uid gelijk is aan 2, 5, 17 of 22.
Gebruik van BETWEEN en NOT BETWEEN
De operatoren BETWEEN en NOT BETWEEN accepteren een array met twee waarden voor de vergelijking.
$query->condition('count', [5,10], 'BETWEEN');
In dit voorbeeld retourneert de query records met een waarde voor count tussen 5 en 10.
Gebruik van IS NULL, IS NOT NULL, EXISTS en NOT EXISTS
Conform afspraak gebruik je de volgende methoden in plaats van condition():
$query->isNull($field); $query->isNotNull($field); $query->exists($field); $query->notExists($field);
Hoewel een conditie als $query->condition($field, NULL, 'IS NOT NULL'); zou moeten werken, wordt het bovenstaande gebruik aanbevolen.
Andere operatoren
Andere operatoren, zoals BINARY of database-specifieke operatoren, kunnen al dan niet werken. Houd hier rekening mee bij het ontwikkelen van modules die in verschillende databasesystemen gebruikt kunnen worden.
Gebruik van meerdere conditions
Je kunt meerdere condition()-methoden toevoegen om de query verder te filteren.
$query->condition('bundle', 'article', '=');
$query->condition('status', 1, '=');
Als er meerdere condition()-aanroepen zijn, zoals in het bovenstaande voorbeeld, moeten alle voorwaarden waar zijn voordat een record in het resultaat verschijnt (de voorwaarden worden dus gecombineerd met AND).
Tip: Om een query te maken die alleen OR-voorwaarden bevat, gebruik je een orConditionGroup.
Condition-groepen
Condition-groepen kunnen worden gebruikt om complexere WHERE-expressies (inclusief OR) in de query te maken. Er zijn twee soorten condition-groepen:
orConditionGroup– retourneert een object met voorwaarden die met OR zijn gecombineerdandConditionGroup– retourneert een object met voorwaarden die met AND zijn gecombineerd
Condition-groepen retourneren een object dat vervolgens als voorwaarde aan de query kan worden toegevoegd.
// Maak de orConditionGroup
$orGroup = $query->orConditionGroup()
->condition('promoted', 1)
->condition('uid', [2,4,7,22], 'IN');
// Voeg de groep toe aan de query.
$query->condition($orGroup);
In dit voorbeeld worden de voorwaarden voor promoted en uid toegevoegd aan de WHERE-clausule, gegroepeerd met OR. Dit resulteert in de volgende WHERE-clausule:
WHERE (promoted = 1 OR uid IN (2,4,7,22))
Indien nodig kun je meerdere orConditionGroup- en andConditionGroup-groepen toevoegen. Condition-groepen kunnen ook genest worden voor complexere WHERE-behoeften.
Het volgende is een voorbeeld van een WHERE-clausule:
WHERE (a = 1 OR b = 1) AND ((c = 1 AND d = 1) OR (e = 1))
De queryvoorwaarden kunnen met condition-groepen als volgt worden geschreven:
$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);