Warum sollte ich EntityFieldQuery verwenden, wenn ich dieselbe Arbeit mit Db_select () ausführen kann , um den Wert abzurufen?
Es wäre besser, wenn jemand ein Beispiel liefern könnte, nicht nur einen Link.
Warum sollte ich EntityFieldQuery verwenden, wenn ich dieselbe Arbeit mit Db_select () ausführen kann , um den Wert abzurufen?
Es wäre besser, wenn jemand ein Beispiel liefern könnte, nicht nur einen Link.
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_foo
mit 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();
Ich denke , dass der Hauptgrund Bevorzugung der EntityFieldQuery
über db_select
ist , 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 .
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 nachfolgendenentity_load()
Aufruf enthalten muss. Dies fügt dem Code viel Rauschen hinzu, IMHO: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()
.quelle
entity_metadata_wrapper()
hier hilft. Sie müssen die Entität noch laden.EntityFieldQuery ist weitaus eingeschränkter als
db_select()
, daher sollten Sie einen guten Grund haben, es nicht zu verwendendb_select()
(siehe Antwortbalken). Es ist ausreichend lesbar und weitaus flexibler.entityFieldQuery
Verwenden Sie beispielsweise innerJoin , um Felder abzurufen. Wenn du aus irgendeinem Grund einen leftJoin brauchst, bist du gefangen ... http://drupal.org/node/1226622quelle