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
01/10/2025, by Ivan

Dynamische query’s verwijzen naar query’s die door Drupal dynamisch worden opgebouwd en niet worden opgegeven als een expliciete querystring. Alle insert-, update-, delete- en merge-query’s moeten dynamisch zijn. Select-query’s kunnen zowel statisch als dynamisch zijn. Daarom verwijst “dynamische query” meestal naar een dynamische SELECT-query.

Opmerking: in 90% van de gevallen waarin je een SELECT-query gebruikt, zal dit een statische query zijn. Bevindt de query zich in het kritieke pad van prestaties, gebruik dan query() in plaats van select() omwille van performance. Gebruik dynamische query’s alleen als delen van de query variabel zijn (bijvoorbeeld: toevoegen van WHERE-voorwaarden afhankelijk van de context) of als ze aanpasbaar moeten zijn.

Alle dynamisch opgebouwde query’s worden gemaakt met een queryobject dat wordt opgevraagd bij het bijbehorende databaseconnectieobject. Net als bij statische query’s kan in de meeste gevallen een procedurele wrapper worden gebruikt om een queryobject te verkrijgen. De verdere opbouw van de query gebeurt echter via methoden die worden aangeroepen op dat queryobject.

Dynamische SELECT-query’s worden gestart met de methode select() als volgt:

$database = \Drupal::database();
$query = $database->select('mytable', 'mt', $options);

In dit geval is mytable de basistabel voor de query; de eerste tabel na het FROM-statement. Merk op dat er geen accolades omheen horen te staan. De query builder handelt dit automatisch af. De tweede parameter is de alias voor de tabel. Als die niet wordt opgegeven, wordt de tabelnaam zelf gebruikt. De array $options is optioneel en identiek aan de $options-array voor statische query’s.

De waarde die wordt teruggegeven door de aanroep $database->select() is een object van het type Select. Dus het type van de variabele $query na deze aanroep is een object van het type Select. Dit object bevat een volledige lijst van methoden, zoals fields(), joins() en group(), die kunnen worden aangeroepen om de query verder te definiëren.

Dynamische SELECT-query’s kunnen zeer eenvoudig of zeer complex zijn. Hieronder bekijken we de afzonderlijke onderdelen die een eenvoudige query vormen, en op de volgende pagina’s bekijken we complexere methoden zoals joins.

Het grotere plaatje

Hier is een relatief eenvoudige query op de user-tabel.

Stel dat we een dynamische query willen maken die ongeveer gelijk is aan de volgende statische query:

$result = $database->query("SELECT uid, name, status, created, access FROM {users} u WHERE uid <> 0 LIMIT 50 OFFSET 0");

Het dynamische equivalent begint als volgt:

// Maak een Select-object aan.
$database = \Drupal::database();
$query = $database->select('users', 'u');
 
// Voeg extra details toe aan dit queryobject: een conditie, velden en een bereik.
$query->condition('u.uid', 0, '<>');
$query->fields('u', ['uid', 'name', 'status', 'created', 'access']);
$query->range(0, 50);

Dit wordt vaak geschreven met behulp van verkorte syntaxis, waarbij meerdere methoden direct achter elkaar worden aangeroepen op het $query-object. De bovenstaande code wordt daarom vaak als volgt geschreven:

// Maak een Select-object aan.
$query = $database->select('users', 'u');
 
// Voeg extra details toe aan dit queryobject: een conditie, velden en een bereik.
$query->condition('u.uid', 0, '<>')
  ->fields('u', ['uid', 'name', 'status', 'created', 'access'])
  ->range(0, 50);

In feite kan de code nog een stap verder worden vereenvoudigd door de aanroep $database->select() direct te koppelen aan de daaropvolgende methoden. Dit geeft:

// Maak een Select-object aan en voeg direct extra details toe
// aan dit queryobject: een conditie, velden en een bereik.
$query = $database->select('users', 'u')
  ->condition('u.uid', 0, '<>')
  ->fields('u', ['uid', 'name', 'status', 'created', 'access'])
  ->range(0, 50);

Dit is de vereenvoudigde vorm van de query die wordt gebruikt door de pagina voor gebruikersbeheer, waarnaar je kunt verwijzen voor verdere studie.

Query uitvoeren

Zodra de query is opgebouwd, roep je de methode execute() aan om de query te compileren en uit te voeren.

$result = $query->execute();

De methode execute() retourneert een resultset-/statementobject dat identiek is aan het object dat door $database->query() wordt teruggegeven, en het kan op exact dezelfde manier worden doorlopen of opgehaald:

$result = $query->execute();
foreach ($result as $record) {
  // Doe iets met elke $record.
}

Opmerking: Wees voorzichtig bij het gebruik van de volgende methoden met een dynamische query die meerdere kolommen retourneert:

Deze methoden vereisen momenteel numerieke kolomindexen (0, 1, 2, enz.) en geen tabelaliassen. De query builder garandeert echter geen vaste volgorde van de geretourneerde velden, dus de kolommen kunnen in een andere volgorde verschijnen dan je verwacht. Met name expressies worden altijd toegevoegd na velden, zelfs als je ze eerst aan de query toevoegt. (Dit probleem geldt niet voor statische query’s, die altijd de kolommen teruggeven in de volgorde waarin jij ze hebt opgegeven.)

Debuggen

Om de SQL-query te bekijken die het queryobject op een bepaald punt in zijn levenscyclus gebruikt, kun je het queryobject afdrukken. Om de argumenten te inspecteren, bekijk je de array die door de methode arguments() wordt teruggegeven:

echo $query;
print_r($query->__toString());
print_r($query->arguments());