9.13. Trabajar con la base de datos en Drupal
Es un caso común ejecutar consultas MySQL durante el desarrollo de módulos en Drupal. Aunque se recomienda utilizar entityQuery
siempre que sea posible, en ocasiones es necesario realizar consultas SQL para obtener datos más complejos.
Puedes guardar esta página en tus marcadores como una hoja de referencia para ejecutar consultas MySQL de tipo select, insert, update y delete en Drupal.
Select
Obtener un único valor:
$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();
Obtener un registro como 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();
También puedes utilizar ->fetchObject()
o ->fetchAll()
para obtener objetos.
Usar LIKE en una consulta:
$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();
Consulta 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');
A continuación se presentan ejemplos de otras consultas como insert, update, upsert y delete. Estas pueden ser útiles si trabajas con tablas personalizadas. Aunque es preferible usar la API de Drupal o módulos contribuidos, si decides realizar consultas personalizadas, aquí tienes algunos ejemplos:
Insert
$query = \Drupal::database()->insert('flood');
$query->fields([
'event',
'identifier'
]);
$query->values([
'My event',
'My identifier'
]);
$query->execute();
Puedes llamar a values()
múltiples veces para insertar varios registros a la vez.
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();
El método key()
se usa para especificar el campo que servirá como clave para determinar si se actualiza o se inserta un nuevo registro. Este campo debe ser único, como nid
, uid
, tid
, fid
, etc.
Delete
$query = \Drupal::database()->delete('flood');
$query->condition('event', 'My event');
$query->execute();
¡Eso es todo! Si necesitas más ejemplos, escríbelo en los comentarios. En los próximos tutoriales veremos cómo usar estas consultas personalizadas en la práctica dentro de Drupal.