web-dev-qa-db-ja.com

複数の値を持つエンティティフィールド条件でクエリを実行する

ユーザーがそのフィールドに複数の分類用語を追加できるエンティティ参照フィールドを持つコンテンツタイプがあります。そのフィールド内に特定の分類用語のセットを持つノードを取得するクエリを実行しようとしています。

そのフィールドで1つの値を使用しても問題ありません。

    $query = \Drupal::entityQuery('node')
        ->condition('status', NODE_PUBLISHED)
        ->condition('type', 'custom_type')
        ->condition('custom_taxonomy', 2)
        ->sort('field_last_name', DESC);

ここで、2は検索している用語のIDです。しかし、そのように2つの特定の用語を含むノードを検索しようとすると、

    $query = \Drupal::entityQuery('node')
        ->condition('status', NODE_PUBLISHED)
        ->condition('type', 'custom_type')
        ->condition('custom_taxonomy', [2,8])
        ->sort('field_last_name', DESC);

エラーが表示されます

無効なパラメーター番号:バインドされた変数の数がトークンの数と一致しません:

私も試みました

    $query = \Drupal::entityQuery('node')
        ->condition('status', NODE_PUBLISHED)
        ->condition('type', 'custom_type')
        ->condition('custom_taxonomy', [2,8], 'IN')
        ->sort('field_last_name', DESC);

これは失敗しませんが、意図した結果を提供しません。用語2があるすべてのノードを表示します[〜#〜]または[〜#〜]用語8。用語2の代わりに[〜#〜] and [〜#〜]用語8は意図したとおりです。ノードのエンティティ参照フィールドに特定の値が複数あるかどうかを確認するクエリを実行するにはどうすればよいですか?

14
Matt

2つの別々のandConditionGroup()を使用します。

$query = \Drupal::entityQuery('node')
  ->condition('status', NODE_PUBLISHED)
  ->condition('type', 'custom_type');
$and = $query->andConditionGroup();
$and->condition('custom_taxonomy', 2);
$query->condition($and);
$and = $query->andConditionGroup();
$and->condition('custom_taxonomy', 8);
$query->condition($and);
$result = $query->execute();

これは、フィールドにいくつの用語が含まれていても、どのデルタに含まれていても機能します。

編集

これにより、次のSQLが生成されます。

SELECT base_table.vid AS vid, base_table.nid AS nid
FROM 
{node} base_table
INNER JOIN {node_field_data} node_field_data ON node_field_data.nid = base_table.nid
INNER JOIN {node__custom_taxonomy} node__custom_taxonomy ON node__custom_taxonomy.entity_id = base_table.nid
INNER JOIN {node__custom_taxonomy} node__custom_taxonomy_2 ON node__custom_taxonomy_2.entity_id = base_table.nid
WHERE  (node_field_data.status = '1') AND (node_field_data.type = 'custom_type') AND( (node__custom_taxonomy.custom_taxonomy_target_id = '2') )AND( (node__custom_taxonomy_2.custom_taxonomy_target_id = '8') )
19
4k4

要求どおりに複雑なクエリを実行するには、条件グループを使用して、デルタをクエリする必要があります。

$query = \Drupal::entityQuery('node');
$query->condition('status', NODE_PUBLISHED)
  ->condition('type', 'custom_type')
  ->condition('custom_taxonomy', [2, 8], 'IN')
  ->condition('custom_taxonomy.%delta', 2, '=')
  ->sort('field_last_name', DESC);
$or = $query->orConditionGroup();
$or->condition('custom_taxonomy.0.target_id', 2);
$or->condition('custom_taxonomy.0.target_id', 8);
$query->condition($or);

QueryInterface :: condition のドキュメントを参照してください。

8
Eyal
$taxonomy_term = 'taxonomy_term';
    $vid = 'name_taxon';
    $terms = $this->entity_type_manager->getStorage($taxonomy_term)
      ->loadTree($vid);

foreach ($terms as $term) {
  $term_data[] = [
    "vid" => $term->vid,
    "name" => $term->name,
  ];
}
1
Viktor