9.13. Werken met de database in Drupal
Het is heel gebruikelijk om dit uit te voeren bij het ontwikkelen van Drupal-modules. Je moet waar mogelijk entityQuery gebruiken, maar soms is het nodig om een SQL-query te gebruiken om complexere gegevens op te halen.
Je kunt deze pagina aan je bladwijzers toevoegen om altijd een handige referentie bij de hand te hebben over hoe je MySQL-query’s select, insert, update en delete uitvoert in Drupal.
Select
Een enkele waarde ophalen:
$query = \Drupal::database()->select('node_field_data', 'n');
$query->addField('n', 'nid');
$query->condition('n.title', 'About Us');
$query->range(0, 1);
$nid = $query->execute()->fetchField();
Een record ophalen als array:
$query = \Drupal::database()->select('node_field_data', 'n');
$query->fields('n', ['nid', 'title']);
$query->condition('n.type', 'page');
$query->range(0, 1);
$vegetable = $query->execute()->fetchAssoc();
Je kunt ook ->fetchObject()
of ->fetchAll()
gebruiken om resultaten als object op te halen.
Gebruik van LIKE in een query:
$query = \Drupal::database()->select('node_field_data', 'n');
$query->fields('n', ['nid', 'title']);
$query->condition('n.type', 'page');
$query->condition('n.title', $query->escapeLike('About') . '%', 'LIKE');
$vegetable = $query->execute()->fetchAllKeyed();
Select-query met JOIN:
$query = \Drupal::database()->select('node_field_data', 'n');
$query->fields('n', ['nid', 'title']);
$query->addField('u', 'name');
$query->join('users_field_data', 'u', 'u.uid = n.uid');
$query->condition('n.type', 'page');
$vegetable = $query->execute()->fetchAllAssoc('nid');
Hieronder staan voorbeelden van andere databasebewerkingen — insert, update, upsert en delete. Deze queries kunnen handig zijn bij het werken met aangepaste tabellen. Denk echter goed na voordat je aangepaste tabellen gebruikt — het is meestal beter om de Drupal API of contrib-modules te gebruiken. Als je toch besluit aangepaste queries naar de database te schrijven, vind je hieronder voorbeelden:
Insert
$query = \Drupal::database()->insert('flood');
$query->fields([
'event',
'identifier'
]);
$query->values([
'My event',
'My indentifier'
]);
$query->execute();
Je kunt values()
meerdere keren aanroepen om meerdere records tegelijk in te voegen.
Update
$query = \Drupal::database()->update('flood');
$query->fields([
'identifier' => 'My new identifier'
]);
$query->condition('event', 'My event');
$query->execute();
Upsert
$query = \Drupal::database()->upsert('flood');
$query->fields([
'fid',
'identifier',
]);
$query->values([
1,
'My indentifier for upsert'
]);
$query->key('fid');
$query->execute();
De methode key()
wordt gebruikt om aan te geven welk veld wordt gebruikt om een bestaand record te bepalen. Je hoeft geen condition()
te schrijven — gebruik gewoon key()
. Het veld dat in key()
wordt gebruikt, moet uniek zijn, bijvoorbeeld nid
, uid
, tid
, fid
of andere entity-ID’s. Als de sleutel niet bestaat, wordt in plaats van een update een nieuw record ingevoegd met de opgegeven sleutel.
Delete
$query = \Drupal::database()->delete('flood');
$query->condition('event', 'My event');
$query->execute();
Dat is alles. Als je meer voorbeelden nodig hebt, schrijf dan gerust in de reacties. In de volgende tutorials bekijken we hoe we aangepaste Drupal-databasequery’s in de praktijk kunnen gebruiken.