Je n'ai jamais eu besoin de le faire avant aujourd'hui, mais il ne semble pas que vous puissiez faire des requêtes OR avec EntityFieldQuery
, car il db_or
est utilisé pour certaines requêtes.
Un exemple serait d'accéder à toutes les entités qui ont un champ de date où la valeur est nulle ou après aujourd'hui.
Suis-je en train de manquer quelque chose ou une astuce ou est-ce simplement non pris en charge?
Réponses:
J'ai vu une solution à ce problème . L'idée est d'utiliser
addTag()
dans la requête et l'implémentationhook_query_TAG_alter()
, où vous avez un bon vieilSelectQuery
objet.la source
Vous pouvez sous-classer
EntityFieldQuery
et remplacer certaines méthodes.Les conditions qui sont ajoutées à un objet de classe
EntityFieldQuery
(par exemple une condition de propriété) sont ajoutées à un tableau.Lorsque la requête est générée, ce tableau est ensuite utilisé dans une boucle similaire à la suivante (le code est présent dans EntityFieldQuery :: propertyQuery () ):
$select_query
contient la valeur renvoyée par un appel àdb_select()
.la source
Vous ne pouvez pas, je le crains, les salles d'opération ne sont pas prises en charge nativement par la
EntityFieldQuery
classe.Une solution consiste à ajouter une balise à la requête avec avec
->addTag()
, puis à implémenterhook_query_TAG_alter()
pour modifier manuellement la structure interne de la requête pour les requêtes contenant cette balise.En faisant cela, vous pourrez parcourir les conditions existantes et apporter les modifications nécessaires pour ajouter votre
OR
logique. Ce n'est pas une jolie façon de le faire cependant; vous pouvez trouver un exemple ici .la source
Pas besoin de diviser les requêtes en 2 et de fusionner ou quelque chose comme ça. Il suffit de modifier la requête
Considérez le scénario: j'avais 2 types d'entité avec des noms de machine: les instructions tincan et tincan_agents
5 champs de référence d'entité sur l'entité
4 d'entre eux sont des champs de référence d'entité réguliers et le 5ème (tincan_object) est un champ de référence de type multi-entités, chaque champ de référence fait référence à des entités de type 'Agent'.
Le champ de référence tincan_object peut référencer des agents et des activités (un troisième type d'entité). Un agent possède une propriété object_type, qui peut être un agent ou un groupe.
Je souhaite trouver toute déclaration faisant référence à l'un des agents possibles, dans l'un des champs de référence. Nous avons besoin d'un opérateur OU entre les conditions de champ, mais nous devons également vérifier le type d'objet du champ de référence de type multi-entités et nous assurer qu'il s'agit de l'une des deux possibilités.
Le code ci-dessous représente le plus simple possible, dans notre solution la requête avait beaucoup d'autres conditions, champs, etc ... donc le code devait ne pas compter sur l'ordre des conditions, ou même si tous ces champs étaient interrogés.
Solution: remarquez dans l'EntityFieldQuery ci-dessus
Cette balise la requête, permettant l'implémentation de hook_query_TAG_alter ()
la source
L'OP veut interroger des entités avec une date nulle OU supérieure à x, je voulais interroger des nœuds sans langue définie OU la langue de l'utilisateur.
addTag()
est la meilleure solution pour ajouter une instruction OR réelle, mais serait exagéré dans mon cas. Mon OU très simple peut être accompli en recherchant la propriété du langage dans un tableau en utilisant:la source