web-dev-qa-db-ja.com

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

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

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

これらの参照の1つでクエリを実行すると結果が得られますが、両方(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();
13
Sketchy Coder

これを実行できないのは、これらのフィールドが両方とも同じエンティティへのエンティティ参照であるためです。つまり、基本テーブルは同じ基本テーブルです。

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

追伸.

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

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

P.P.S.

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

8
Eyal

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

$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で来週見つけてください。それで終わりです。

3
user49

実際に私はこれへのハックを見つけました。これが私が見つけたものの私の説明です:

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

さまざまな条件の組み合わせで数回試行した後に生成された内部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条件として機能します。

私はハックを誇りに思っていませんが、それが機能するので、これが誰かがいつか救うのを助けることができるなら、それのために行ってください。

1
Elias