Nur einige Felder mit EntityFieldQuery abrufen?

19

Drupal 7 bietet mit EntityFieldQuery ein vielversprechendes ORM-ähnliches Abfragesystem.

Derzeit verstehe ich, wie man Knoten auswählt, aber das Ergebnis enthält keine spezifischen Informationen, wie zum Beispiel die von mir gesuchten Dateien.

$query = new EntityFieldQuery();
$entities = $query->entityCondition('entity_type', 'node')
                        ->entityCondition('bundle', 'event')
                        ->propertyCondition('status', 1)
                        ->fieldCondition('field_date', 'value', array('2011-03-01', '2011-03-31'), 'BETWEEN')
                        ->fieldOrderBy('field_date', 'value', 'ASC')
                        ->execute();

Wir müssen also ganze Daten von Knoten laden, wenn wir nur Werte eines Feldes erhalten möchten, zum Beispiel 'field_date' im aktuellen Beispiel.

$nodes = entity_load('node', array_keys($entities['node']));

Wenn es eine Möglichkeit gibt, den Wert von Feldern abzurufen, laden Sie stattdessen die vollständigen Daten aller Knoten, da dies zu einer gewissen Speicherüberlastung führt.

$nodesFieldDates = ???
Fedir RYKHTIK
quelle

Antworten:

10

Gute Frage!

EntityFieldQuery ist wirklich gutes Zeug, aber wenn Sie es wirklich ernst meinen wollen, müssen Sie die Klasse in einem benutzerdefinierten Modul überschreiben und das Verhalten hinzufügen, das Sie dort tun müssen.

Ich kenne Ihre genauen Absichten nicht, aber ich habe mich in der Vergangenheit auf diesen Artikel zu diesem Thema bezogen. Dank an Neil Hastings für diese gut geschriebene Beschreibung.

Suchen Sie im Artikel nach Codebeispielen, um Beispiele für das Überschreiben zu finden.

Hoffe das hilft, viel Spaß beim Programmieren!

stefgosselin
quelle
OK, ich verstehe ! Daher ist es wahrscheinlich möglich, die "EntityFieldQuery" - "buildQuery" -Methode neu zu definieren, um die resultierenden Felder zu wechseln. Wahrscheinlich könnte das funktionieren.
Fedir RYKHTIK
11

Ich habe die Antwort dafür gefunden! Das Apache Solr-Modul erweitert die EntityFieldQuery-Klasse , um dies zu ermöglichen. Es wird eine neue Methode namens addExtraField hinzugefügt.

<?php
$query = new ApachesolrAttachmentsEntityFieldQuery();
$entities = $query->entityCondition('entity_type', 'node')
  ->entityCondition('bundle', 'event')
  ->propertyCondition('status', 1)
  ->fieldCondition('field_date', 'value', array('2011-03-01', '2011-03-31'), 'BETWEEN')
  ->fieldOrderBy('field_date', 'value', 'ASC')
  ->addExtraField('field_date', 'value', 'value')
  ->execute();
?>

Wenn Sie Apache Solr nicht installiert haben, kopieren Sie einfach den Code zum Erweitern dieser Klasse.

mikeytown2
quelle
Hierfür wurde eine Sandbox erstellt, da das Apache Solr-Modul einige Nachteile hatte. Drupal.org/sandbox/mikeytown2/2209909
mikeytown2
2
Upvoted diese Antwort einfach für das (derzeit Sandbox) Modul erstellt von mikeytown2 (danke!)
Oliver Coleman
Der Link in der Antwort scheint nicht zu funktionieren. Es heißt "Sie müssen sich anmelden oder anmelden, bevor Sie fortfahren können."
mbomb007
@ mbomb007 github.com/AmazeeLabs/apachesolr_attachments/blob/… Der Link wurde aktualisiert
mikeytown2
0

Wer noch Felder von einem EFQ erhalten möchte, schaut sich das EFQ-Zusatzfelder- Modul an.

Warnung: Dieses Modul missbraucht EntityFieldQuery, um Daten aus Ihrer Datenbank zurückzugeben. Es funktioniert nicht mit Entitäten oder Modulen, die darauf aufbauen.

Sie können damit addField in einem EntityFieldQueryExtraFields-Objekt verwenden (erweitert EntityFieldQuery-Objekte). Anfänglich gibt EntityFieldQuery nur die Entitäts-ID, das Bundle und den Entitätstyp zurück. Dieses Modul fügt darüber hinaus eine zusätzliche Ebene hinzu, ohne dass zusätzliche entity_loads ausgeführt werden müssen! Wichtig, wenn Sie mit großen Datenmengen arbeiten und die SQL-Abfragen reduzieren möchten. Da EFQ die Datenbank bereits nach diesen Informationen abfragt, können Sie diese Abfrage so ändern, dass Sie auch einige zusätzliche Felder erhalten. Dies bedeutet, dass keine einzige zusätzliche Abfrage ausgeführt wird, um diese Daten abzurufen.

Ein Wort der Vorsicht, wenn Sie sich auf eine Nachformatierung / ein Nachladen verlassen, das in entity_load oder ähnlichen Funktionen vorkommt, wird dies von diesem Modul nicht berücksichtigt. Sie müssen die Gültigkeit der abgerufenen Daten selbst sicherstellen.

Beispiel

Abrufen des Knotentitels

$ query = new EntityFieldQueryExtraFields ();
  $ result = $ query-> entityCondition ('entity_type', 'node')
  -> propertyCondition ('type', 'my_bundle_type')
  -> propertyCondition ('status', 1)
  -> addExtraField ('field_myfield', value ', value')
  -> addExtraField ('field_mynodereffield', nid ', nid')
  -> addExtraField ('', 'title', 'title', 'node')
  -> fieldCondition ('field_myfield', 'value', 'some_value_to_filter_on', '=')
  -> execute ();
Mögliche Kombinationen:
addExtraField ($ field_name, $ column, $ column_alias = NULL, $ table = NULL)

Feldname
Geben Sie an, aus welchem ​​Feld das zusätzliche Feld stammen soll. Wenn es aus einer Basistabelle stammt, lassen Sie es leer und geben Sie das Argument table ein

Säule
Geben Sie den Namen der Spalte an.

column_alias
Geben Sie den Alias ​​der Spalte an.

Tabelle
Optional können Sie hier einen Knoten oder einen Benutzer (die Basistabelle) hinzufügen.
tenken
quelle
Ich habe sowohl dieses Modul (EFQ Extra Fields) als auch das (derzeit Sandbox-) Modul von mikeytown2 ausprobiert, und das letztere schien viel besser zu sein (benutzerfreundlicher, vernünftigerer Output) und scheint auch viel besser gepflegt zu sein als das erstere. Das mikeytown2 Sandbox-Modul finden Sie unter drupal.org/sandbox/mikeytown2/2209909 .
Oliver Coleman