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

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

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

N'hésitez pas à nous contacter ou à vous inscrire à notre formation «Drupal pour les développeurs et développeuses» pour en savoir plus !

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);

Votre commentaire

Le contenu de ce champ sera maintenu privé et ne sera pas affiché publiquement.
Votre adresse servira à afficher un Gravatar et à vous notifier des réponses. Votre commentaire sera anonymisé si ce billet est dépublié pendant plus de 3 mois.
Pour lutter contre le spam notre système enregistre votre adresse IP et votre adresse e-mail si vous la partagez.
Nous vous invitons à consulter notre politique de confidentialité pour comprendre les traitements faits de ces données et comment les rectifier.

À propos de Julien

Co-fondateur - Scrum master & Expert technique

Utilisateur de Drupal depuis 2008, j’ai fait mes armes comme développeur chez Commerce Guys puis me suis mis à encadrer les nouveaux arrivants avant de donner des formations, participer aux avant ventes et accompagner les équipes au passage à Scrum.

Je suis impliqué dans la communauté française de Drupal depuis 2009, j’ai été tour à tour président puis vice-président de l’association Drupal France et francophonie entre 2011 et 2013.