9.13. Travailler avec la base de données dans Drupal
C’est un cas courant lors du développement de modules Drupal. Vous devriez utiliser entityQuery lorsque c’est possible, mais parfois il est nécessaire d’utiliser des requêtes SQL pour obtenir des données plus sophistiquées.
Vous pouvez ajouter cette page à vos favoris pour toujours avoir un aide-mémoire sur la manière d’exécuter des requêtes MySQL select, insert, update, delete dans Drupal.
Select
Récupérer une valeur unique :
$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();
Récupérer une entrée sous forme de tableau :
$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();
Vous pouvez aussi utiliser ->fetchObject()
ou ->fetchAll()
pour obtenir une entrée sous forme d’objet.
Utilisation de LIKE dans la requête :
$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();
Requête select avec 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');
Voici des exemples d’autres requêtes de base de données : insert, update, upsert, et delete. Ces requêtes peuvent être utiles pour travailler avec des tables personnalisées. Mais réfléchissez bien avant d’utiliser des tables personnalisées. Il est préférable d’utiliser l’API Drupal ou des modules contrib. Mais si vous décidez malgré tout d’écrire des requêtes personnalisées, voici des exemples :
Insert
$query = \Drupal::database()->insert('flood');
$query->fields([
'event',
'identifier'
]);
$query->values([
'My event',
'My indentifier'
]);
$query->execute();
Vous pouvez appeler plusieurs fois values()
pour insérer plusieurs enregistrements à la fois.
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();
La méthode key()
sert à indiquer le champ qui permettra d’identifier un enregistrement existant. Vous n’avez pas besoin d’utiliser condition()
, la méthode key()
suffit. Le champ utilisé dans key()
doit être unique, par exemple nid, uid, tid, fid ou autres ID d’entités. Si la clé n’existe pas, au lieu de mettre à jour l’enregistrement, un nouvel enregistrement sera inséré avec la clé spécifiée.
Delete
$query = \Drupal::database()->delete('flood');
$query->condition('event', 'My event');
$query->execute();
Voilà tout. Si vous avez besoin de plus d’exemples, écrivez dans les commentaires. Dans les prochains tutoriels, nous verrons comment utiliser ces requêtes personnalisées Drupal en pratique.