EntityFieldQuery vs Db_select ()

Antworten:

11

Ich denke, der Punkt ist, dass die Syntax viel einfacher ist und der Code verständlicher wird.

Wenn Sie beispielsweise möchten, dass Knoten mit einem Typ my_type, dessen Feld field_foomit dem Wert benannt ist $val, mit Db_Select Folgendes tun:

$nids = db_select('node', 'n')
  ->fields('n', array('nid'))
  ->join('field_data_field_foo', 'foo', 'foo.entity_id = n.nid')
  ->condition('n.type', 'my_type')
  ->condition('foo.field_foo_value', $val)
  ->execute()->fetchCol();

Was mit EntityFieldQuery viel einfacher ist:

$query = new EntityFieldQuery;
$entities = $query->entityCondition('entity_type', 'node')
  ->entityCondition('bundle', 'my_type')
  ->fieldCondition('field_foo', 'value', $val)
  ->execute();
IcanDivideBy0
quelle
14

Ich denke , dass der Hauptgrund Bevorzugung der EntityFieldQueryüber db_selectist , dass Sie nicht mit anderen Worten über die untergeordnete Struktur, wissen müssen: wie Sachen in der Datenbank gespeichert sind. Dies verbessert die lose Kopplung .

Bart
quelle
6
Dies ist richtig, obwohl es noch weiter geht. Der Feldspeicher ist steckbar. Die Standardimplementierung speichert Felddaten in einer separaten Tabelle pro Feld in der Datenbank. Sie kann jedoch ersetzt werden. Beispielsweise gibt es eine Implementierung, mit der Felddaten in MongoDB gespeichert werden können. Wenn Sie möchten, dass Ihr Code portierbar ist und nicht nur an Ihrer spezifischen Site-Konfiguration arbeitet, müssen Sie EntityFieldQuery verwenden.
Berdir
3

EntityFieldQuery (EFQ) gibt nur Entitäts-IDs zurück. Wenn Sie auf Entitätsdaten zugreifen möchten, müssen Sie callen entity_load(), wodurch beim Laden der Daten sichergestellt wird, dass alle zugrunde liegenden Dinge, die Sie normalerweise nicht interessieren (wie das Laden von Feldern, das Aufrufen anderer Modul-Hooks usw.), erstellt werden . Dies führt natürlich zu zwei SQL-Abfragen und viel Overhead, aber dies ist der Preis, den Sie für die Abstraktion zahlen müssen.

Da die EFQ-Syntax klarer ist, ist es meiner Meinung nach viel mehr eine Frage der persönlichen Vorlieben. Ich denke zum Beispiel nicht , dass EFQ klarer ist. Beachten Sie, dass ein funktionsfähiger db_select()Ersatz mit EFQ den Rückgabewerttest und den nachfolgenden entity_load()Aufruf enthalten muss. Dies fügt dem Code viel Rauschen hinzu, IMHO:

$query = new EntityFieldQuery();
$entities = $query->entityCondition('entity_type', 'node')
  ->entityCondition('bundle', 'my_type')
  ->fieldCondition('field_foo', 'value', $val)
  ->execute();
if (!empty($entities['node'])) {
  $nodes = entity_load('node', array_keys($entities['node']));
} else {
  $nodes = array();
}

Beantworten Sie also Ihre Frage: Verwenden Sie EFQ, wenn Ihre Entitäten über umfassende Funktionen verfügen (z. B. feldfähig sind, von anderen Modulen verwendet werden können usw.) und / oder wenn Sie der Meinung sind, dass die Syntax klarer ist. In anderen Fällen kann verwenden db_select().

Flaviovs
quelle
Nicht genau, Sie können entity_metadata_wrapper verwenden und nur auf das zugreifen, was Sie benötigen.
Kevin
Ich verstehe nicht, wie das entity_metadata_wrapper()hier hilft. Sie müssen die Entität noch laden.
Flaviovs
1

EntityFieldQuery ist weitaus eingeschränkter als db_select(), daher sollten Sie einen guten Grund haben, es nicht zu verwenden db_select()(siehe Antwortbalken). Es ist ausreichend lesbar und weitaus flexibler.

entityFieldQueryVerwenden Sie beispielsweise innerJoin , um Felder abzurufen. Wenn du aus irgendeinem Grund einen leftJoin brauchst, bist du gefangen ... http://drupal.org/node/1226622

yann_yinn
quelle
Nun, ich würde gerne wissen, warum meine Antwort eine "-1" hatte. Ja, entityFieldQuery ist hübscher, aber weniger effizient als db_select, eine sehr schöne, robuste und vollständige API. Ich entferne einen Großteil meiner entityFieldQuery aus meinem Code, weil sie für bestimmte Anwendungsfälle zu begrenzt war wies darauf hin. Sowieso.
Yann_yinn
1
Ich denke, einige mögen Ihre Antwort nicht, weil sie nicht erkennt, dass entityFieldQuery eine Abstraktionsschicht über verschiedenen Speichermethoden ist, was ein cooles Feature ist. Ich arbeite an vielen Sites, von denen wir wissen, dass MySQL beispielsweise immer die Datenbank für x / y / z sein wird, und wir bevorzugen es, schlankere Datenbankabfragen zu schreiben, wenn dies erforderlich ist. EntityFieldQuery finde ich nicht schöner als db_select. Die beiden Vergleiche oben auf der Seite sind optisch nahezu identisch.
Charlie Schliesser
yep, deshalb habe ich geschrieben "see bart answer". Mit Ausnahme dieses speziellen Anwendungsfalls wird db_select effizienter und weitaus flexibler.
yann_yinn
Ich stimme vollkommen zu.
Charlie Schliesser