9.13. Lavorare con il database in Drupal
È un caso comune dover eseguire query durante lo sviluppo di moduli Drupal. Dovresti sempre utilizzare entityQuery quando possibile, ma a volte è necessario ricorrere a query SQL dirette per ottenere dati più complessi.
Puoi aggiungere questa pagina ai preferiti per avere sempre a portata di mano una guida rapida su come eseguire query MySQL SELECT, INSERT, UPDATE e DELETE in Drupal.
SELECT
Ottenere un singolo valore:
$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();
Ottenere una voce come 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();
Puoi anche usare ->fetchObject()
o ->fetchAll()
per ottenere i risultati come oggetti.
Utilizzo di LIKE nella 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();
Esempio di query SELECT con 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');
Qui sotto trovi esempi per altre operazioni sul database come INSERT, UPDATE, UPSERT e DELETE. Queste query possono essere utili per lavorare con tabelle personalizzate. Tuttavia, pensa bene prima di creare tabelle custom: è sempre meglio usare le API di Drupal o i moduli contrib. Ma se decidi comunque di scrivere query personalizzate, ecco alcuni esempi:
INSERT
$query = \Drupal::database()->insert('flood');
$query->fields([
'event',
'identifier'
]);
$query->values([
'My event',
'My identifier'
]);
$query->execute();
Puoi chiamare values()
più volte per inserire più record in un’unica query.
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 identifier for upsert'
]);
$query->key('fid');
$query->execute();
Il metodo key()
serve per definire il campo che sarà usato per determinare se un record esiste già. Non è necessario scrivere condition()
; puoi semplicemente usare key()
. Il campo usato nella chiave deve essere unico (ad esempio nid
, uid
, tid
, fid
o altri ID di entità). Se la chiave non esiste, al posto di aggiornare il record verrà inserito un nuovo record con la chiave specificata.
DELETE
$query = \Drupal::database()->delete('flood');
$query->condition('event', 'My event');
$query->execute();
Questo è tutto. Se hai bisogno di altri esempi, scrivilo nei commenti. Nei prossimi tutorial vedremo come utilizzare query personalizzate al database nella pratica.