Perché dovrei usare EntityFieldQuery quando posso fare lo stesso lavoro con Db_select () per recuperare il valore.
Sarebbe meglio se qualcuno potesse fornire un esempio, non solo un collegamento.
Perché dovrei usare EntityFieldQuery quando posso fare lo stesso lavoro con Db_select () per recuperare il valore.
Sarebbe meglio se qualcuno potesse fornire un esempio, non solo un collegamento.
Risposte:
Penso che il punto sia che la sintassi è molto più semplice e il codice sarà più comprensibile.
Ad esempio, se vuoi nodi con tipo my_type
che hanno un campo chiamato field_foo
con il valore $val
, con Db_Select, fai qualcosa come:
$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();
Che è molto più semplice con EntityFieldQuery:
$query = new EntityFieldQuery;
$entities = $query->entityCondition('entity_type', 'node')
->entityCondition('bundle', 'my_type')
->fieldCondition('field_foo', 'value', $val)
->execute();
Penso che il motivo principale abbiamo preferito EntityFieldQuery
sopra db_select
è che non c'è bisogno di conoscere la struttura di livello inferiore, in altre parole: come roba è memorizzato nel database. Questo migliora l' accoppiamento libero .
EntityFieldQuery (EFQ) restituirà solo gli ID entità. Se vuoi accedere ai dati delle entità, dovrai chiamare entity_load()
, che, tra il caricamento dei dati, farà in modo che vengano fatte tutte le cose sottostanti che normalmente non ti interessano (come il caricamento di campi, la chiamata di hook di altri moduli ecc.) . Ovviamente, questo comporta due query SQL e un sacco di costi generali, ma questo è il prezzo da pagare per l'astrazione.
Per quanto riguarda la sintassi EFQ essendo più chiara, penso che sia molto più una questione di preferenze personali. Ad esempio, non credo che l'EFQ sia più chiaro. Si noti che un db_select()
sostituto funzionante con EFQ deve includere il test del valore di ritorno e la entity_load()
chiamata successiva e questo aggiunge molto rumore al codice, 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();
}
Quindi, rispondendo alla tua domanda: usa EFQ se le tue entità sono full optional (ad esempio sono fieldable, possono essere utilizzate da altri moduli, ecc.) E / o pensi che la sua sintassi sia più chiara. Se altri casi, è possibile utilizzare db_select()
.
entity_metadata_wrapper()
aiuta qui. Devi ancora caricare l'entità.
EntityFieldQuery è molto più limitato di db_select()
, quindi dovresti avere davvero un buon motivo per non usarlo db_select()
(vedi risposta al bart), che è abbastanza leggibile e molto più flessibile.
Ad esempio, entityFieldQuery
utilizzare innerJoin per recuperare i campi. Se hai bisogno di un LeftJoin per qualsiasi motivo, sei intrappolato ...
http://drupal.org/node/1226622