Aller au contenu principal
Julien Dubois

Drupal 10 : Charger, lister et afficher des entités avec EntityQuery

Ce billet a été produit dans le contexte d'Happyculture, il a pu être écrit en collaboration.

Cet article a été initialement rédigé pour Drupal 8 mais son contenu est toujours d'actualité pour Drupal 9 et Drupal 10.


Tirer toute la puissance des listes d'entités. Ajouter ses conditions et trouver comment charger les entités qui remplissent nos conditions avant de les rendre dans notre mode d'affichage souhaité.

Lister des entités

Depuis Drupal 8 existe un Service de requêtage d’entités entity.query via la classe \Drupal\Core\Entity\Query\QueryFactory.
Une fois une instance récupérée, il est possible de chaîner les conditions pour former une requête :

$fids = \Drupal::entityQuery('file')
  ->condition('status', FILE_STATUS_PERMANENT, '<>')
  ->condition('changed', REQUEST_TIME - $age, '<')
  ->range(0, 100)
  ->execute();

Une possibilité offerte par ce service est que vous pouvez traverser vos entités pour ajouter des conditions sur leurs relations. Ce genre de condition est licite par exemple :

$latest_archive = \Drupal::entityQuery('node')
  ->condition('type', 'mag_article')
  ->condition('associated_mag.entity:node.mag_type.value', 'archives')
  ->range(0, 1)
  ->sort('nid', 'DESC')
  ->execute();

Charger des entités

Une classe de gestion des entités a été créée dans Drupal 8, il s’agit de la classe \Drupal\Core\Entity\EntityTypeManager. Elle donne accès à plusieurs outils pour charger, lister, ou afficher des entités. La méthode getStorage() donne ainsi accès à une classe de gestion de stockage des entités qui implémente EntityStorageInterface. Les méthodes load() ou loadMultiple() quant à elles permettent de charger une ou plusieurs entités à la fois.

$entitytype_manager = \Drupal::service('entity_type.manager');
$storage = $entitytype_manager->getStorage('file');
$files = $storage->loadMultiple($fids);

Afficher des entités

Dans Drupal 9 ou Drupal 10, l’affichage d’un contenu se fait grâce à la classe \Drupal\Core\Entity\EntityTypeManager et les classes se basant sur l’interface EntityViewBuilderInterface. Il faut utiliser la méthode getViewBuilder() pour récupérer une instance de la classe et les méthodes view() et viewMultiple() pour en faire le rendu dans un render array.

$view_builder = $entitytype_manager->getViewBuilder('file');
$output = $view_builder->viewMultiple($nodes, $view_mode);

Pour rebondir