Ich möchte eine Abfrage mit dem EntityFieldQuery-Objekt ausführen. Ich benötige Werte aus der Tabelle node und node_access, daher muss INNER JOIN verwendet werden. Aus der Do-Dokumentation kann ich nicht herausfinden, wie dies möglich ist.
Folgendes habe ich -
$query = new EntityFieldQuery();
$result = $query->entityCondition('entity_type', 'node')
->entityCondition('bundle', 'node_access')
->propertyCondition('type', 'external_link')
->propertyCondition('status', 1)
->fieldCondition('gid', '3', '=')
->fieldCondition('realm', 'domain_id', '=')
->fieldCondition('grant_view', '1', '>=')
->range(0,1)
->execute();
->fieldCondition('field_name', 'target_id', $entities_a, 'IN');
Antworten:
Sie können einer
EntityFieldQuery
direktenhook_query_TAG_alter()
Verknüpfung keine zusätzlichen Verknüpfungen hinzufügen (dies wird nicht unterstützt), Sie können jedoch der Abfrage ein Tag hinzufügen, die Verknüpfung implementieren und manuell hinzufügen, wenn die Abfrage in eine Standard-DB-Abfrage konvertiert wird.Dies ist nicht getestet, wird aber wahrscheinlich den größten Teil des Weges dorthin bringen:
Und dann die Abfrageänderungsfunktion:
Die andere Möglichkeit besteht darin, sich selbst in Unterklassen zu unterteilen
EntityFieldQuery
und den Join hinzuzufügen, aber ich denke, dass die obige Methode in diesem Fall einfacher ist.quelle
EntityFieldQuery
db_select
Dann können Sie so viel Kontrolle darüber haben, wie Sie möchtenEntityFieldQuery
führt kein Caching durch, sondern umschließt nur aSelectQuery
und fügt einige Methoden für Entitäten hinzu. Diese zusätzlichen Methoden erklären den geringfügigen (sehr geringfügigen) Leistungsabfall, den Sie bei der Verwendung feststellen würden, im Gegensatz zu einem regulärenSelectQuery
Wenn Sie benutzerdefinierte Eigenschaften mit Ihren eigenen Tabellen verwenden, funktioniert die Tag-Methode nicht. Sie müssen stattdessen Unterabfragen verwenden:
Siehe Benötigen Sie einen Join in einer EntityFieldQuery? Wie wäre es mit einer Unterabfrage? für Details.
quelle