web-dev-qa-db-fra.com

Comment obtenir toutes les entités de noeud marquées avec un terme spécifique?

Pour un terme de taxonomie donné en D8, existe-t-il une fonction/méthode API qui renvoie toutes les entités de nœud qui le référencent?

10
Peter T Graber

Vous pouvez utiliser loadByProperties() pour obtenir toutes les entités de noeud qui référencent $term_id:

$nodes = \Drupal::entityTypeManager()->getStorage('node')->loadByProperties([
  'field_tags' => $term_id,
]);
11
4k4

La façon la plus simple, je pense, est de rechercher la base de données taxonomy_index la table enregistre quel nœud est étiqueté avec quel terme

function _get_nodes_by_term($term_id) {
  $query = \Drupal::database()->select('taxonomy_index', 'ti');
  $query->fields('ti', ['nid']);
  $query->condition('ti.tid', $term_id);
  $nodes = $query->execute()->fetchAssoc();
  return $nodes;
}

dpm(_get_nodes_by_term(<term_id>));

Drupal Core le fait par des vues.
L'affichage de la page du terme boîte est créé par les vues, donc si vous visitez admin/structure/views/view/taxonomy_term, cette vue est chargée d'afficher tout le contenu balisé par terme donné, qui exécute essentiellement une requête de base de données.

9
arpitr

Si vous avez plusieurs identifiants de termes, vous pouvez transmettre un tableau des identifiants au lieu d'une seule valeur.

$term_ids =  array (1,2,3);
$nodes = \Drupal::entityTypeManager()->getStorage('node')->loadByProperties([
  'field_tags' => $term_ids,
]);
5
Wendy Weihs

Si vos nœuds n'ont pas de révision, alors ce code fonctionnera, par défaut, il retournera la première révision

  $nodes = \Drupal::entityTypeManager()->getStorage('node')->getQuery()
 ->condition('field_tags', $termId)
 ->execute();

Si vos nœuds ont plusieurs révisions, pour obtenir les nœuds par la dernière révision balisée. Vous devez utiliser le code suivant

$nodes = \Drupal::entityTypeManager()->getStorage('node')->getQuery()
->latestRevision()
->condition('field_tags', $termId, '=')
->execute();

si vous avez plusieurs valeurs, vous pouvez utiliser un tableau

 $termIds = [3,56,456];
 $nodes = \Drupal::entityTypeManager()->getStorage('node')->getQuery()
 ->latestRevision()
 ->condition('field_tags', $termIds)
 ->execute();
1