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();
Respostas:
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.
fonte
Um palpite selvagem e não testado:
Se isso não funcionar, encontre-me no IRC # drupal-contribut na próxima semana e chegaremos ao fim.
fonte
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
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:
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.
fonte