entityQuery com várias condições em termos de taxonomia não retorna resultado

13

No meu caso de uso, tenho uma entidade que possui dois campos que se referem a vocabulários exclusivos.

Notícias: - tag (referência da entidade) - categoria (referência da entidade)

Se eu consultar uma dessas referências, obtenho resultados, no entanto, quando consulta ambos (um filtro AND), não obtive resultados. Eu o verifiquei três vezes até agora e existem entidades que contêm a tag e a categoria que estou consultando.

Isso é um erro do usuário ou um erro do 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: Encontrei uma solução alternativa consultando o valor bruto em vez de entity.value. Esta é uma situação não desejável, embora

$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
fonte
A conjunção padrão para EQ é AND (que você pode alterar), portanto não há nada errado com as condições de agrupamento ... é por isso que está lá. Eu não entendo o que você esperava?

Respostas:

8

A razão pela qual você não pode fazer isso é que ambos os campos são referência de entidade para a mesma entidade. Isso significa que a tabela base é a mesma tabela base.

Você está solicitando ao Drupal que Una a tabela taxonomy_data à tabela de nós e, em seguida, torne uma condição AND impossível nela.

PS

Você pode usar em condition('field_tags', 1);vez decondition('field_tags', [1], 'IN');

E, como mencionado nos comentários, o grupo de condições AND é o padrão, portanto você não precisa especificá-lo.

PPS

Você deve fazer com que ambas as condições usem o ID referenciado para ser consistente.

Eyal
fonte
1
Essa resposta cobre apenas uma imaginação ingênua de como a consulta de entidade poderia funcionar. É muito, muito mais capaz que isso, no entanto. Veja minha resposta.
3

Um palpite selvagem e não testado:

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

Se isso não funcionar, encontre-me no IRC # drupal-contribut na próxima semana e chegaremos ao fim.

Tim Yao
fonte
Isso deve ser corrigido no Drupal Core, mas a solução acima funciona.
Mr.B
1

Na verdade, eu encontrei um truque para isso. Aqui está a minha explicação do que eu encontrei:

Eu tinha três campos no meu tipo de conteúdo, cada um com uma referência a um termo de taxonomia de diferentes vocabulários. E eu queria consultar as entidades sobre as que têm um termo de taxonomia específico em cada um desses 3 campos (uma e condição).

verificando a consulta SQL interna que é produzida após várias tentativas com diferentes combinações de condições, descobri 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))

basicamente, como você pode ver, ele não tem referência aos campos individuais reais usando esse vocabulário específico, então meu truque é fazer algo assim:

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

novamente isso funciona, eu testei e funciona como uma condição AND retornando apenas o tipo de conteúdo com esses 3 termos de taxonomia, mesmo que as referências a esses termos de taxonomia sejam armazenadas em campos diferentes no tipo de conteúdo.

Não tenho orgulho do hack, mas funciona, portanto, se isso puder ajudar alguém a economizar algum tempo, tente.

Elias
fonte