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.
Antworten:
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 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()
.
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 verwenden db_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/1226622