logo

Extra Block Types (EBT) - Nuova esperienza con Layout Builder❗

Extra Block Types (EBT) - tipi di blocchi stilizzati e personalizzabili: Slideshows, Tabs, Cards, Accordion e molti altri. Impostazioni integrate per sfondo, DOM Box, plugin javascript. Vivi oggi il futuro della costruzione dei layout.

Demo moduli EBT Scarica moduli EBT

❗Extra Paragraph Types (EPT) - Nuova esperienza con Paragraphs

Extra Paragraph Types (EPT) - insieme di moduli basati su paragrafi in modo analogo.

Demo moduli EPT Scarica moduli EPT

Scorri

9.13. Lavorare con il database in Drupal

16/10/2025, by Ivan

È 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.