Maison >développement back-end >tutoriel php >La version Drupal 8 de EntityFieldQuery
API de requête d'entité de Drupal 8: un guide complet
Drupal 8 est passé de EntityFieldQuery (Drupal 7) au service plus robuste entity.query
pour les entités de requête. Ce service, accessible via des appels statiques ou une injection de dépendance, facilite les requêtes complexes à l'aide de méthodes de condition. Ce guide explore ses capacités.
Concepts clés
entity.query
Service: Le cœur de la requête d'entité de Drupal 8. Crée des objets de requête pour des types d'entités spécifiques (nœuds, utilisateurs, etc.). execute()
Méthode: Renvoie un tableau d'ID d'entité. entity_load()
/ entity_load_multiple()
: Fonctions pour charger des entités uniques ou multiples en utilisant leurs ID. Accès au service entity.query
Deux méthodes existent pour accéder au service:
1. Accès statique (moins recommandé):
<code class="language-php">$query = \Drupal::entityQuery('node');</code>
Remplacez le «nœud» par le nom de la machine du type d'entité souhaité.
2. Injection de dépendance (recommandée):
<code class="language-php">$entity_query_service = $container->get('entity.query'); $query = $entity_query_service->get('node');</code>
Cette approche est préférée pour une meilleure testabilité et découplage.
Requêtes de construction
Voici des exemples démontrant la construction de requêtes:
Requête simple (nœuds publiés):
<code class="language-php">$query = \Drupal::entityQuery('node') ->condition('status', 1); $nids = $query->execute();</code>
$nids
contient un tableau d'ID de nœud.
Requête complexe (conditions multiples):
<code class="language-php">$query = \Drupal::entityQuery('node') ->condition('status', 1) ->condition('changed', REQUEST_TIME, '<') ->condition('title', 'cat', 'CONTAINS') ->condition('field_tags.entity.name', 'cats'); $nids = $query->execute();</code>
Cela récupère les nœuds publiés modifiés avant l'heure actuelle, contenant "Cat" dans le titre, et faisant référence au terme de taxonomie "Cats" dans field_tags
. Notez la manipulation des entités référencées (field_tags.entity.name
).
Groupes de condition (et / ou):
<code class="language-php">$query = \Drupal::entityQuery('node') ->condition('status', 1) ->condition('changed', REQUEST_TIME, '<'); $group = $query->orConditionGroup() ->condition('title', 'cat', 'CONTAINS') ->condition('field_tags.entity.name', 'cats'); $nids = $query->condition($group)->execute();</code>
Ceci utilise un orConditionGroup
pour trouver des nœuds correspondant à la condition de titre ou de balise. andConditionGroup
est également disponible.
Entités de chargement
Après avoir exécuté une requête, utilisez ces fonctions pour charger des entités:
Entité unique:
<code class="language-php">$node = entity_load('node', $nids[0]);</code>
Entités multiples:
<code class="language-php">$nodes = entity_load_multiple('node', $nids);</code>
Ces fonctions sont des emballages pour le gestionnaire de stockage des entités. L'accès direct via le gestionnaire de stockage est également possible en utilisant l'injection de dépendance:
<code class="language-php">$node_storage = $container->get('entity.manager')->getStorage('node'); $nodes = $node_storage->loadMultiple($nids);</code>
Conclusion
L'API d'entité de Drupal 8 de Drupal 8 offre une amélioration significative par rapport à son prédécesseur. Son approche orientée objet et ses méthodes de condition flexible permettent aux développeurs de construire des requêtes entités sophistiquées. N'oubliez pas d'utiliser l'injection de dépendance pour de meilleures pratiques de code.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!