D8の特定の分類用語について、それを参照するすべてのノードエンティティを返すAPI関数/メソッドはありますか?
D8の特定の分類用語について、それを参照するすべてのノードエンティティを返すAPI関数/メソッドはありますか?
回答:
私が考える最も簡単な方法は、データベース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
、このビューは、基本的にデータベースクエリを実行している特定の用語ですべてのタグ付けされたコンテンツを表示する責任があります。
複数の用語IDがある場合は、単一の値の代わりにIDの配列を渡すことができます。
$term_ids = array (1,2,3);
$nodes = \Drupal::entityTypeManager()->getStorage('node')->loadByProperties([
'field_tags' => $term_ids,
]);
ノードにリビジョンがない場合、このコードは機能し、デフォルトでは最初のリビジョンを返します
$nodes = \Drupal::entityTypeManager()->getStorage('node')->getQuery()
->condition('field_tags', $termId)
->execute();
ノードに複数のリビジョンがある場合、最新のタグ付けされたリビジョンでノードを取得します。次のコードを使用する必要があります
$nodes = \Drupal::entityTypeManager()->getStorage('node')->getQuery()
->latestRevision()
->condition('field_tags', $termId, '=')
->execute();
複数の値がある場合は、配列を使用できます
$termIds = [3,56,456];
$nodes = \Drupal::entityTypeManager()->getStorage('node')->getQuery()
->latestRevision()
->condition('field_tags', $termIds)
->execute();