entityQuery avec plusieurs conditions sur les termes de taxonomie ne renvoie aucun résultat

13

Dans mon cas d'utilisation, j'ai une entité qui a deux champs qui font référence à des vocabulaires uniques.

Actualités: - tag (référence d'entité) - catégorie (référence d'entité)

Si j'interroge sur l'une de ces références, j'obtiens des résultats, mais lorsque j'interroge les deux (un filtre AND), je n'obtiens aucun résultat. Je l'ai vérifié maintenant et il existe des entités qui contiennent à la fois la balise et la catégorie que j'interroge.

S'agit-il d'une erreur utilisateur ou d'un bug 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();

EDIT: J'ai trouvé une solution de contournement en interrogeant la valeur brute au lieu de entity.value. Il s'agit d'une situation non souhaitable cependant

$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();
Sketchy Coder
la source
La conjonction par défaut pour l'égalisation est ET (que vous pouvez modifier), donc il n'y a rien de mal à regrouper les conditions ... c'est pourquoi il est là. Je ne comprends pas ce que vous attendiez?

Réponses:

8

La raison pour laquelle vous ne pouvez pas le faire est que ces deux champs sont une référence d'entité à la même entité. Cela signifie que la table de base est la même table de base.

Vous demandez à Drupal de joindre la table taxonomy_data à la table des nœuds, puis de lui imposer une condition AND impossible.

PS

Vous pouvez utiliser condition('field_tags', 1);au lieu decondition('field_tags', [1], 'IN');

Et comme mentionné dans les commentaires, le groupe de conditions AND est la valeur par défaut, vous n'avez donc pas besoin de le spécifier.

PPS

Vous devez avoir les deux conditions utiliser l'ID référencé pour être cohérent.

Eyal
la source
1
Cette réponse ne couvre qu'une imagination naïve de la façon dont la requête d'entité pourrait fonctionner. C'est beaucoup, beaucoup plus capable que cela, cependant. Vérifiez ma réponse.
3

Une supposition sauvage et non testée:

$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'));

Si cela ne fonctionne pas, retrouvez-moi dans IRC # drupal-contribution la semaine prochaine et nous y arriverons.

Tim Yao
la source
Cela devrait être corrigé dans Drupal Core mais la solution ci-dessus fonctionne.
Mr.B
1

En fait, j'ai trouvé un hack à cela. voici mon explication de ce que j'ai trouvé:

J'avais 3 champs dans mon type de contenu contenant chacun une référence à un terme de taxonomie de différents vocabulaires. Et je voulais interroger les entités pour celles qui ont un terme de taxonomie spécifique dans chacun de ces 3 champs (an et condition).

vérifier la requête SQL interne qui est produite après plusieurs tentatives avec différentes combinaisons de conditions, j'ai constaté que

[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))

fondamentalement comme vous pouvez le voir, il n'a aucune référence aux champs individuels réels utilisant ce vocabulaire spécifique, donc mon hack est de faire quelque chose comme ceci:

 $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');

Encore une fois, cela fonctionne, je l'ai testé et cela fonctionne comme une condition ET renvoyant uniquement le type de contenu avec ces 3 termes de taxonomie même si les références à ces termes de taxonomie sont stockées dans différents champs du type de contenu.

Je ne suis pas fier du hack mais cela fonctionne, donc si cela peut aider quelqu'un à économiser un jour, allez-y.

Elias
la source