web-dev-qa-db-fra.com

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

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 de l'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();
13
Sketchy Coder

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 faire une condition AND impossible sur celle-ci.

P.S.

Vous pouvez utiliser condition('field_tags', 1); au lieu de condition('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.

P.P.S.

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

8
Eyal

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 à la fin).

3
user49

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.

1
Elias