it-swarm.com.de

Nur einige Felder mit EntityFieldQuery abrufen?

Drupal 7 verfügt über ein vielversprechendes ORM-ähnliches Abfragesystem mit EntityFieldQuery.

Derzeit verstehe ich, wie man Knoten auswählt, aber das Ergebnis enthält keine spezifischen Informationen, wie z. B. Dateien, nach denen ich suche.

$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 = ???
18
Fedir RYKHTIK

Gute Frage!

EntityFieldQuery ist wirklich gutes Zeug, aber wenn Sie wirklich ernst werden wollen, müssen Sie das überschreiben Klasse in einem benutzerdefinierten Modul und fügen Sie das Verhalten hinzu, das Sie dort ausführen 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 Zusammenfassung.

Suchen Sie im Artikel nach Codebeispielen für nette Beispiele für das Überschreiben.

Hoffe das hilft, viel Spaß beim Codieren!

10
stefgosselin

Ich habe die Antwort darauf 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.

11
mikeytown2

Sie müssen nichts überschreiben oder die Klasse erweitern. Sie müssen nur field_attach_load() verwenden, um das gewünschte Feld an die Ergebnisse der Klasse EntityFieldQuery anzuhängen.

Siehe auch Laden nur eines Felds von einer Entität oder Node in Drupal 7 , ein guter Artikel mit Beispielen dazu .

8
jyee

Wer noch Felder von einem EFQ erhalten möchte, schaut sich das Modul EFQ Extra Fields 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 addField in einem EntityFieldQueryExtraFields-Objekt verwenden (erweitert EntityFieldQuery-Objekte). Zu Beginn gibt EntityFieldQuery nur die Entitäts-ID, das Bundle und den Entitätstyp zurück. Dieses Modul fügt eine zusätzliche Ebene hinzu, ohne zusätzliche entity_loads auszuführen! 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 ändern, um auch einige zusätzliche Felder zu 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/Nachladung verlassen, die in entity_load oder ähnlichen Funktionen erfolgt, wird sich dieses Modul nicht darum kümmern. 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) 
 
 field_name 
 Geben Sie an, aus welchem ​​Feld das zusätzliche Feld stammen soll. Wenn es aus einer Basistabelle stammt, lassen Sie es leer und füllen Sie das Tabellenargument 
 
 Spalte 
 Geben Sie den Namen der Spalte an, 
 
 column_alias 
 Geben Sie den Alias ​​der Spalte an, 
 
 table 
 Fügen Sie hier optional etwas wie Knoten oder Benutzer hinzu (die Basistabelle), 
0
tenken