web-dev-qa-db-ja.com

特定の用語でタグ付けされたすべてのノードエンティティを取得するにはどうすればよいですか?

D8の特定の分類用語について、それを参照するすべてのノードエンティティを返すAPI関数/メソッドはありますか?

10
Peter T Graber

loadByProperties()を使用して、$term_idを参照するすべてのノードエンティティを取得できます。

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

私が考える最も簡単な方法は、データベースをクエリすることですtaxonomy_indexテーブルには、どのノードにどの用語がタグ付けされているかが記録されます

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はビューによってそれを行います。
すぐに利用できるページ表示はビューによって作成されるため、アクセスした場合はadmin/structure/views/view/taxonomy_term、このビューは、基本的にデータベースクエリを実行している特定の用語ですべてのタグ付けされたコンテンツを表示する責任があります。

9
arpitr

複数の用語IDがある場合は、単一の値の代わりにIDの配列を渡すことができます。

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

ノードにリビジョンがない場合、このコードは機能し、デフォルトでは最初のリビジョンを返します

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

ノードに複数のリビジョンがある場合、最新のタグ付けされたリビジョンでノードを取得するには、次のコードを使用する必要があります

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

複数の値がある場合は、arrayを使用できます

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