Ich hatte bis heute noch nie die Notwendigkeit, dies zu tun, aber es scheint nicht so, als könnten Sie mit ODER-Abfragen arbeiten EntityFieldQuery
, da dies db_or
für ausgewählte Abfragen verwendet wird.
Ein Beispiel bezieht sich auf alle Entitäten mit einem Datumsfeld, deren Wert null oder später als heute ist.
Fehlt mir etwas oder ein Trick oder wird dies einfach nicht unterstützt?
Antworten:
Ich habe eine Lösung für dieses Problem gesehen . Die Idee ist,
addTag()
in Query und Implement zu verwendenhook_query_TAG_alter()
, wo Sie gute alteSelectQuery
Objekte haben.quelle
Sie können
EntityFieldQuery
einige Methoden unterklassifizieren und überschreiben.Die Bedingungen, die einem Objekt der Klasse hinzugefügt werden
EntityFieldQuery
(z. B. eine Eigenschaftsbedingung), werden einem Array hinzugefügt.Wenn die Abfrage erstellt wird, wird dieses Array in einer Schleife verwendet, die der folgenden ähnelt (der Code ist in EntityFieldQuery :: propertyQuery () enthalten ):
$select_query
Enthält den von einem Aufruf an zurückgegebenen Wertdb_select()
.quelle
Sie können keine Angst haben, ORs werden von der
EntityFieldQuery
Klasse nicht nativ unterstützt .Eine Möglichkeit besteht darin, der Abfrage mit ein Tag hinzuzufügen
->addTag()
und dann zu implementierenhook_query_TAG_alter()
, um die interne Struktur der Abfrage für Abfragen, die dieses Tag enthalten, manuell zu ändern.Auf diese Weise können Sie die vorhandenen Bedingungen durchlaufen und die erforderlichen Änderungen vornehmen, um Ihre
OR
Logik hinzuzufügen . Es ist jedoch keine schöne Methode, dies zu tun. Ein Beispiel finden Sie hier .quelle
Keine Notwendigkeit, Abfragen in 2 zu teilen und zusammenzuführen oder ähnliches. Müssen nur die Abfrage ändern
Stellen Sie sich das Szenario vor: Ich hatte zwei Entitätstypen mit Maschinennamen: tincan-Anweisungen und tincan_agents
5 Entitätsreferenzfelder auf der Entität
4 davon sind reguläre Entitätsreferenzfelder und das fünfte (tincan_object) ist ein Referenzfeld mit mehreren Entitäten, wobei jedes Referenzfeld auf Entitäten vom Typ 'Agent' verweist.
Das Referenzfeld tincan_object kann auf Agenten und Aktivitäten verweisen (ein dritter Entitätstyp). Ein Agent hat eine Eigenschaft object_type, die entweder Agent oder Group sein kann.
Ich möchte eine Aussage finden, die auf einen von mehreren möglichen Agenten in einem der Referenzfelder verweist. Wir benötigen einen OR-Operator zwischen den fieldConditions, müssen aber auch den object_type des Referenzfelds mit mehreren Entitätstypen überprüfen und sicherstellen, dass es sich um eine von zwei Möglichkeiten handelt.
Der folgende Code stellt den einfachsten möglichen Code dar. In unserer Lösung hatte die Abfrage viele andere Bedingungen, Felder usw., sodass der Code nicht mit der Reihenfolge der Bedingungen gerechnet werden musste oder auch wenn alle diese Felder abgefragt wurden.
Lösung: Beachten Sie in der obigen EntityFieldQuery
Dies markiert die Abfrage und ermöglicht die Implementierung von hook_query_TAG_alter ()
quelle
Das OP möchte nach Entitäten mit dem Datum null ODER größer als x suchen. Ich möchte nach Knoten ohne definierte Sprache ODER nach der Sprache des Benutzers suchen.
addTag()
ist die beste Lösung für das Hinzufügen einer tatsächlichen ODER-Anweisung, wäre aber in meinem Fall übertrieben. Mein sehr einfaches ODER kann erreicht werden, indem die Spracheigenschaft in einem Array nachgeschlagen wird mit:quelle