En mi caso de uso, tengo una entidad que tiene dos campos que hacen referencia a vocabularios únicos.
Noticias: - etiqueta (referencia de entidad) - categoría (referencia de entidad)
Si consulto sobre una de esas referencias, obtengo resultados; sin embargo, cuando consulto ambos (un filtro AND) no obtengo resultados. Ya lo he verificado tres veces y hay entidades que contienen tanto la etiqueta como la categoría que estoy consultando.
¿Es esto un error del usuario o un error de 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();
EDITAR: He encontrado una solución al consultar el valor bruto en lugar de entity.value. Sin embargo, esta es una situación no deseable
$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();
Respuestas:
La razón por la que no puede hacer eso es que ambos campos son referencias de entidad a la misma entidad. Eso significa que la tabla base es la misma tabla base.
Le está pidiendo a Drupal que una la tabla taxonomy_data a la tabla de nodos y luego haga una condición AND imposible en ella.
PD
Puedes usar en
condition('field_tags', 1);
lugar decondition('field_tags', [1], 'IN');
Y como se menciona en los comentarios, el grupo de condiciones AND es el predeterminado, por lo que no necesita especificarlo.
PPS
Debe hacer que ambas condiciones usen la identificación referenciada para ser coherente.
fuente
Una suposición salvaje y no probada:
Si esto no funciona, búscame en IRC # drupal-contrib la próxima semana y llegaremos al final.
fuente
En realidad encontré un truco para esto. Aquí está mi explicación de lo que he encontrado:
Tenía 3 campos en mi tipo de contenido, cada uno con una referencia a un término de taxonomía de diferentes vocabularios. Y quería consultar a las entidades para aquellas que tienen un término de taxonomía específico en cada uno de esos 3 campos (una y condición).
comprobando la consulta SQL interna que se produce después de varios intentos con diferentes combinaciones de condiciones, encontré que
básicamente, como puede ver, no tiene referencia a los campos individuales reales que usan ese vocabulario específico, por lo que mi truco es hacer algo como esto:
De nuevo, esto funciona, lo he probado y funciona como una condición AND que devuelve solo el tipo de contenido con esos 3 términos de taxonomía, incluso si las referencias a esos términos de taxonomía se almacenan en diferentes campos en el tipo de contenido.
No estoy orgulloso del truco, pero funciona, así que si esto puede ayudar a alguien a ahorrar en algún momento, adelante.
fuente