Consultas a entidades con EntityQuery en Drupal 8

Imagen
Libros en un portatil

Una de las grandes novedades de Drupal 7, fue el camino que tomo con la creación del concepto de entidades. En Drupal 8 esto se ha mejorado mucho, ahora las entidades están completamente integradas en el core de Drupal, y desarrollar un modulo que permita trabajar con prácticamente cualquier entidad es mas sencillo que en Drupal 7.

En este caso, vamos a ver como realizar consultas a las entidades en Drupal 8 utilizando eñ servicio EntityQuery; en Drupal 7 existía EntityFieldQuery, y si estamos familiarizados con el, realizar las consultas nos resultara sencillo, ya que es incluso mas simple que antes.

Obtener el servicio EntityQuery

Este es el paso mas “complicado” ya que implica realizar un par de llamadas, lo primero es utilizar la clase estática de Drupal (si disponemos del container debemos usarlo) para llamar al servicio entityTypeManager, a continuación obtenemos el Storage de la entidad, y finalmente el servicio EntityQuery para la entidad seleccionada, en este ejemplo, la entidad es “node”.

$query = \Drupal::entityTypeManager()->getStorage('node')->getQuery();

Nota: En versiones anteriores a la 8.3, se podía obtener utilizando “$query = \Drupal::entityQuery('node');”, pero ahora se encuentra obsoleto ese método, y se debe usar el ejemplo superior.

Para ejecutar las consultas, se utiliza el método “execute” el cual nos devolverá las nid de todos los nodos que den como resultado de la consulta realizada.

$nids = $query->execute();
 

Añadir condiciones a la consultas

Este paso es muy simple, unicamente debemos usar el método “condition” para añadir la condición que queramos, admite 4 parámetros, “campo”, “valor”, “operador” e “idioma”, normalmente usaremos los primeros 2, el operador por defecto es “=”.

Para obtener los nodos que estén publicados y pertenezcan a tipo “article”, debemos ejecutar los siguiente:

$query = \Drupal::entityTypeManager()->getStorage('node')->getQuery();
$query->condition(‘status’, 1)
  ->condition(‘bundle’, ‘article’);
$nids = $query->execute();

En el ejemplo se puede apreciar el uso del método “condition” para buscar por “status” y “bundle”.

Consultas con OR, AND y NULL

En alguna ocasión, puede que necesitemos realizar consultas con la condición OR (por defecto son AND), para esto, debemos crear un “grupo”, especificar las condiciones, y a continuación ejecutar la consulta. En el siguiente ejemplo, obtenemos los nodos de tipo ”page” o “article”.

$query = \Drupal::entityTypeManager()→getStorage('node')->getQuery();
    $group = $query->orConditionGroup()
        ->condition('type', 'page')
        ->condition('type', 'article');
    $entity_ids = $query
        ->condition($group)
        ->execute();

Para utilizar Null y Not Null, debemos usar los métodos “notExists” y “exists” respectivamente:

$query = \Drupal::entityTypeManager()→getStorage('node')→getQuery();
$query->notExists('field_name');// Comprueba que el valor sea NULL.
$query->exists('field_name');//Comprueba que el valor sea NOT NULL.
$nids = $query->execute();

Como podemos ver, es muy sencillo hacer consultas a entidades, no necesitamos utilizar consultas simples ni hacer los joins de las tablas. Utilizando el servicio EntityQuery nos podemos ahorrar muchas horas de trabajo en consultas.