Nunca he tenido la necesidad de hacer esto antes, pero no parece que pueda hacer consultas OR EntityFieldQuery
, ya que db_or
se utiliza para consultas seleccionadas.
Un ejemplo llegaría a todas las entidades que tienen un campo de fecha donde el valor es nulo o posterior a hoy.
¿Me estoy perdiendo algo o algún truco o simplemente no es compatible?
Respuestas:
He visto una solución a este problema . La idea es usar
addTag()
en consultas e implementarhook_query_TAG_alter()
, donde tiene un buenSelectQuery
objeto antiguo .fuente
Puede subclasificar
EntityFieldQuery
y anular algunos métodos.Las condiciones que se agregan a un objeto de clase
EntityFieldQuery
(por ejemplo, una condición de propiedad) se agregan a una matriz.Cuando se genera la consulta, esa matriz se usa en un bucle similar al siguiente (el código está presente en EntityFieldQuery :: propertyQuery () ):
$select_query
contiene el valor devuelto por una llamada adb_select()
.fuente
No me temo, los OR no son compatibles de forma nativa con la
EntityFieldQuery
clase.Una forma de evitarlo podría ser agregar una etiqueta a la consulta con with
->addTag()
, luego implementarhook_query_TAG_alter()
para cambiar la estructura interna de la consulta manualmente para consultas que contengan esa etiqueta.Al hacer esto, podrá recorrer las condiciones existentes y realizar las modificaciones necesarias para agregar su
OR
lógica. Sin embargo, no es una forma bonita de hacerlo; Puedes encontrar un ejemplo aquí .fuente
No es necesario dividir las consultas en 2 y fusionar ni nada de eso. Solo necesito alterar la consulta
Considere el escenario: tenía 2 tipos de entidad con nombres de máquina: declaraciones de tincan y tincan_agents
5 campos de referencia de entidad en la entidad
4 de ellos son campos de referencia de entidad regular y el quinto (tincan_object) es un campo de referencia de tipo multi-entidad, cada campo de referencia hace referencia a entidades de tipo 'Agente'.
El campo de referencia tincan_object puede hacer referencia a Agentes y Actividades (un tercer tipo de entidad). Un agente tiene una propiedad object_type, que puede ser Agent o Group.
Quiero encontrar cualquier Declaración que haga referencia a uno de varios Agentes posibles, en cualquiera de los campos de referencia. Necesitamos un operador OR entre las condiciones de campo, pero también debemos verificar el tipo de objeto del campo de referencia de tipo de entidad múltiple y asegurarnos de que sea una de las dos posibilidades.
El siguiente código representa el más simple posible, en nuestra solución, la consulta tenía muchas otras condiciones, campos, etc., por lo que el código no debía contar con el orden de las condiciones, o incluso si se consultaban todos estos campos.
Solución: Aviso en el EntityFieldQuery anterior
Esto etiqueta la consulta, permitiendo la implementación de hook_query_TAG_alter ()
fuente
El OP quiere consultar entidades con fecha nula O mayor que x, quería consultar nodos sin lenguaje definido O el idioma del usuario.
addTag()
es la mejor solución para agregar una declaración OR real, pero sería excesivo en mi caso. Mi OR muy simple se puede lograr buscando la propiedad del lenguaje en una matriz usando:fuente