logo

Extra Block Types (EBT) - Nieuwe Layout Builder ervaring❗

Extra Block Types (EBT) - gestileerde, aanpasbare bloktypes: Slideshows, Tabs, Cards, Accordions en vele andere. Ingebouwde instellingen voor achtergrond, DOM Box, javascript-plugins. Ervaar vandaag al de toekomst van layout building.

Demo EBT-modules Download EBT-modules

❗Extra Paragraph Types (EPT) - Nieuwe Paragraphs ervaring

Extra Paragraph Types (EPT) - analoge op paragrafen gebaseerde set modules.

Demo EPT-modules Download EPT-modules

Scroll

Werken met de database in Drupal 7 – les 12 – Queryvoorwaarden (WHERE, HAVING, LIKE)

14/10/2025, by Ivan

Een queryvoorwaarde maakt het mogelijk alleen die records te selecteren die aan bepaalde criteria voldoen — bijvoorbeeld nodes die niet ouder zijn dan twee weken, of termen waarin het woord “drupal” voorkomt, enzovoort. In SQL gebruiken we WHERE en HAVING om beperkingen op te leggen aan SELECT-, UPDATE- en DELETE-query’s. In dynamische query’s in Drupal is een vergelijkbaar mechanisme voor voorwaarden geïmplementeerd. Dit werkt op dezelfde manier voor alle drie de querytypen: selecteren, bijwerken en verwijderen.

Concept van voorwaardelijke expressies

Een voorwaarde wordt vastgelegd in een speciale expressie die de beperking bepaalt.

Combinatie (optelling, conjunctie)

Elke voorwaarde kan bestaan uit meerdere expressies die samen worden gecombineerd. Voorwaarden worden gecombineerd met de operatoren AND (EN) en OR (OF).

Voorwaardelijk object

Drupal stelt elk fragment van een voorwaarde voor als een instantie van de klasse QueryConditional. Een voorwaardelijk object is dus een object van deze klasse.

Laten we een voorbeeld bekijken van een SQL-query:

Query:

SELECT FROM {mytable} WHERE (a = 1 AND b = 'foo' OR (c = 'bar'))

Voorwaardelijke expressie:

WHERE (a = 1 AND b = 'foo' OR (c = 'bar'))

Delen van de expressie:

(a = 1 AND b = 'foo' OR (c = 'bar'))
(c = 'bar')

Operatoren die de voorwaarden verbinden:

AND, OR

De queryobjecten SELECT, UPDATE en DELETE worden geïmplementeerd via de interface QueryConditionalInterface, die de nodige methodes biedt voor elk van deze drie typen query’s. Dit object wordt vervolgens verpakt in een QueryConditional-object. Je kunt de klasse QueryConditional ook rechtstreeks aanroepen.

Elk deel van een voorwaardelijke expressie wordt standaard verbonden via de operator AND. Eén of meer fragmenten kunnen worden gecombineerd met andere operatoren, zoals OR.

API

Er zijn twee hoofdmethodes om met voorwaardelijke objecten te werken:

$query->condition($field, $value = NULL, $operator = '=')

De methode condition() definieert een veld, waarde en operator voor een queryvoorwaarde. Deze methode wordt gebruikt voor binaire vergelijkingen (waar de uitkomst waar of onwaar is), zoals =, <, >=, LIKE enzovoort. Als de operator niet wordt opgegeven, wordt standaard = gebruikt (exacte overeenkomst). Dus voor een eenvoudige vergelijking kun je schrijven condition('myfield', $value), wat wordt vertaald naar myfield = :value, waarbij :value wordt vervangen door de waarde van de variabele $value.

$query->where($snippet, $args = array())

De methode where() is een aanvullende methode — je kunt ook gewoon condition() gebruiken. Omdat where() echter vaak voorkomt, bestaat er een aparte shorthand voor. In de variabele $snippet schrijf je een gewone SQL-voorwaarde, en in $args geef je een array met vervangende waarden op voor de placeholders in $snippet.

Het gebruik van condition() heeft de voorkeur boven where().

Voorwaarden met arrays

Vaak moet je een voorwaarde formuleren met meerdere mogelijke waarden. Hiervoor geef je een array van waarden door aan de query. De meest gebruikte SQL-operatoren in zulke gevallen zijn IN en BETWEEN. De operator IN selecteert records die exact overeenkomen met een van de waarden in de array.

<?php
$query->condition('myfield', array(1, 2, 3), 'IN');
// Wordt: myfield IN (:db_placeholder_1, :db_placeholder_2, :db_placeholder_3)
?>

Zo selecteren we alle records waarbij myfield gelijk is aan 1, 2 of 3.

Om een waardegebied (range) te specificeren in plaats van exacte waarden, gebruiken we BETWEEN:

<?php
$query->condition('myfield', array(5, 10), 'BETWEEN');
// Wordt: myfield BETWEEN :db_placeholder_1 AND :db_placeholder_2
?>

Hiermee selecteren we alle records waarbij de waarde van myfield tussen 5 en 10 ligt.

Geneste voorwaarden

De eerste parameter van condition() kan ook een ander voorwaardelijk object zijn. Zo kun je geneste voorwaarden opnemen in complexere query’s. Het resultaat is een samengestelde expressie met AND- en OR-operatoren waar nodig.

De helper db_condition() retourneert een nieuw voorwaardelijk object. Deze methode accepteert één parameter: het type logische verbinding dat moet worden gebruikt. Daarnaast bestaan er handige helpers: db_or(), db_xor() (uitsluitend OF), en db_and(). Meestal zijn deze helpers voldoende. Laten we een voorbeeld bekijken:

<?php
$query
  ->condition('field1', array(1, 2), 'IN')
  ->condition(db_or()->condition('field2', 5)->condition('field3', 6))
// Resultaat:
// (field1 IN (:db_placeholder_1, :db_placeholder_2) AND (field2 = :db_placeholder_3 OR field3 = :db_placeholder_4))
?>

NULL-waarden

Om te controleren op NULL-waarden gebruik je de volgende methodes:

<?php
$query->isNull('myfield');
// Resultaat: (myfield IS NULL)

$query->isNotNull('myfield');
// Resultaat: (myfield IS NOT NULL)
?>

Deze methodes isNull() en isNotNull() kunnen gecombineerd worden met where() en condition().

Let op: het gebruik van condition('myfield', NULL) is verouderd. Gebruik isNull() of isNotNull().

Subquery’s

De methode condition() ondersteunt subquery’s in de parameter $value. Voor subquery’s wordt de klasse SelectQuery gebruikt, die wordt aangemaakt met db_select(). In plaats van de methode select() uit te voeren, geef je het object door aan condition().

Subquery’s zijn handig voor korte en eenvoudige query’s die betrekking hebben op één veld. Als je iets heel complex wilt doen met db_select(), kun je beter overstappen op het gebruik van condition().

Laten we enkele voorbeelden van subquery’s bekijken:

db_delete()

<?php
db_delete('sessions')
  ->condition('timestamp', REQUEST_TIME - $lifetime, '<')
  ->execute();
// DELETE FROM {sessions} WHERE (timestamp < 1228713473)
?>

db_update()

<?php
db_update('sessions')
  ->fields(array(
    'sid' => session_id()
  ))
  ->condition('sid', $old_session_id)
  ->execute();
// UPDATE {sessions} SET sid = 'abcde' WHERE (sid = 'fghij');
?>

db_delete() met OR-voorwaarden

<?php
// Uit taxonomy_term_save():
$or = db_or()->condition('tid1', 5)->condition('tid2', 6);
db_delete('term_relation')->condition($or)->execute();
// DELETE FROM {term_relation} WHERE ((tid1 = 5 OR tid2 = 6))
?>