分類条件に複数の条件があるentityQueryが結果を返さない


13

私のユースケースでは、一意の語彙を参照する2つのフィールドを持つエンティティがあります。

ニュース:-タグ(エンティティ参照)-カテゴリ(エンティティ参照)

これらの参照のいずれかでクエリを実行すると結果が表示されますが、両方のクエリ(ANDフィルター)を実行しても結果は表示されません。私は今までにトリプルチェックしており、クエリしているタグとカテゴリの両方を含むエンティティがあります。

これはユーザーエラーですか、それともDrupalのバグですか?

$query = \Drupal::entityQuery('node')
    ->condition('status', 1)
    ->condition('type', 'news')
;
$group = $query->andConditionGroup()
    ->condition('field_tag.entity.name', ['cars'], 'IN')
    ->condition('field_category.entity.name', ['sport'], 'IN')
;
$query->condition($group);
$nids = $query->execute();

編集:entity.valueの代わりに生の値をクエリすることで回避策を見つけました。これは望ましくない状況ですが

$query = \Drupal::entityQuery('node')
    ->condition('status', 1)
    ->condition('type', 'news')
;
$group = $query->andConditionGroup()
    ->condition('field_tag.entity.name', ['cars'], 'IN')
    ->condition('field_category', [1], 'IN')
;
$query->condition($group);
$nids = $query->execute();

EQのデフォルトの組み合わせはAND(変更可能)であるため、条件をグループ化しても問題はありません。私はあなたが期待していたことを理解していませんか?

回答:


8

それができない理由は、これらのフィールドの両方が同じエンティティへのエンティティ参照であるためです。つまり、ベーステーブルは同じベーステーブルです。

Drupalにtaxonomy_dataテーブルをノードテーブルに結合してから、それに対して不可能なAND条件を作成するように要求しています。

PS

condition('field_tags', 1);代わりに使用できますcondition('field_tags', [1], 'IN');

また、コメントで述べたように、AND条件グループはデフォルトであるため、指定する必要はありません。

PPS

両方の条件で参照IDを使用して、一貫性を保つ必要があります。


1
この答えは、エンティティクエリがどのように機能するかについての単純な想像力のみをカバーしています。ただし、これよりもはるかに優れています。私の答えを確認してください。

3

ワイルドでテストされていない推測:

$query = \Drupal::entityQuery('node')
  ->condition('status', 1)
  ->condition('type', 'news');

$query = $query->condition($query->andConditionGroup()->condition('field_tag.entity.name', ['cars'], 'IN'))
  ->condition($query->andConditionGroup()->condition('field_category.entity.name', ['sport'], 'IN'));

これがうまくいかない場合は、来週IRC#drupal-contributeで見つけてください。それで終わりです。


これはDrupal Coreで修正する必要がありますが、上記のソリューションは機能します。
Mr.B

1

実際、私はこれに対するハックを見つけました。ここに私が見つけたものの説明があります:

コンテンツタイプには3つのフィールドがあり、それぞれが異なる語彙からの分類用語への参照を保持していました。そして、これら3つのフィールド(anおよびcondition)のそれぞれに特定の分類用語があるエンティティのエンティティを照会したかったのです。

条件の異なる組み合わせで数回試行した後に生成される内部SQLクエリをチェックする

[Previous conditions] AND (taxonomy_term__[taxonomy_term_field_name] IN  (:db_condition_placeholder_2)) AND (taxonomy_term__[taxonomy_term_field_name] IN  (:db_condition_placeholder_3)) AND (taxonomy_term__[taxonomy_term_field_name] IN  (:db_condition_placeholder_4))

基本的にあなたが見ることができるように、それはその特定の語彙を使用する実際の個々のフィールドへの参照を持っていないので、私のハックはこのようなことをすることです:

 $query = \Drupal::entityQuery('node')
            ->condition('status', '1')
            ->condition('type', $content_type_machine_name)
            ->condition('field_holding_term_ref.entity.name', array($label_of_term_in_field1, $label_of_term_in_field2, $label_of_term_in_field3), 'IN');

再びこれは動作します。テストし、それらの分類用語への参照がコンテンツタイプの異なるフィールドに保存されている場合でも、3つの分類用語を持つコンテンツタイプのみを返すAND条件として動作します。

私はこのハックを誇りに思っていませんが、うまくいきます。だから誰かがいつか救うのに役立つなら、それを手に入れてください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.