Nunca tive a necessidade de fazer isso antes de hoje, mas não parece que você possa fazer consultas OR EntityFieldQuery
, pois db_or
é usado para consultas selecionadas.
Um exemplo chegaria a todas as entidades que possuem um campo de data em que o valor é nulo ou depois de hoje.
Estou faltando alguma coisa ou algum truque ou isso simplesmente não é suportado?
Respostas:
Eu já vi uma solução para esse problema . A idéia é usar
addTag()
na consulta e na implementaçãohook_query_TAG_alter()
, onde você tem um bomSelectQuery
objeto antigo .fonte
Você pode sublassar
EntityFieldQuery
e substituir alguns métodos.As condições adicionadas a um objeto da classe
EntityFieldQuery
(por exemplo, uma condição de propriedade) são adicionadas a uma matriz.Quando a consulta é criada, essa matriz é usada em um loop semelhante ao seguinte (o código está presente em EntityFieldQuery :: propertyQuery () ):
$select_query
contém o valor retornado de uma chamada paradb_select()
.fonte
Você não pode ter medo, as RUPs não são suportadas nativamente pelo
EntityFieldQuery
classe.Uma maneira alternativa pode ser adicionar uma tag à consulta com
->addTag()
, e implementarhook_query_TAG_alter()
para alterar a estrutura interna da consulta manualmente para consultas que contenham essa tag.Fazendo isso, você poderá percorrer as condições existentes e fazer as alterações necessárias para adicionar sua
OR
lógica. Não é uma maneira bonita de fazer isso; você pode encontrar um exemplo aqui .fonte
Não há necessidade de dividir as consultas em 2 e mesclar ou algo assim. Só preciso alterar a consulta
Considere o cenário: eu tinha 2 tipos de entidade com nomes de máquinas: instruções tincan e tincan_agents
5 campos de referência da entidade na entidade
4 deles são campos regulares de referência a entidades e o quinto (tincan_object) é um campo de referência com várias entidades, cada campo de referência faz referência a entidades do tipo 'Agente'.
O campo de referência tincan_object pode fazer referência a agentes e atividades (um terceiro tipo de entidade). Um agente tem uma propriedade object_type, que pode ser agente ou grupo.
Quero encontrar qualquer declaração que faça referência a um dos vários agentes possíveis, em qualquer um dos campos de referência. Precisamos de um operador OR entre as fieldConditions, mas também precisamos verificar o object_type do campo de referência do tipo multi-entidade e garantir que seja uma das duas possibilidades.
O código abaixo representa o mais simples possível, em nossa solução a consulta tinha muitas outras condições, campos, etc ... então o código precisava não contar com a ordem das condições, ou mesmo se todos esses campos estivessem sendo consultados.
Solução: Aviso no EntityFieldQuery acima
Isso marca a consulta, permitindo a implementação de hook_query_TAG_alter ()
fonte
O OP deseja consultar entidades com data nula OU maior que x, eu queria consultar nós sem idioma definido OU o idioma do usuário.
addTag()
é a melhor solução para adicionar uma instrução OR real, mas seria um exagero no meu caso. Meu OR muito simples pode ser realizado consultando a propriedade language em uma matriz usando:fonte