¿Por qué debería usar EntityFieldQuery cuando puedo hacer el mismo trabajo con Db_select () para obtener el valor?
Sería mejor si alguien puede proporcionar un ejemplo, no solo un enlace.
¿Por qué debería usar EntityFieldQuery cuando puedo hacer el mismo trabajo con Db_select () para obtener el valor?
Sería mejor si alguien puede proporcionar un ejemplo, no solo un enlace.
Respuestas:
Creo que el punto es que la sintaxis es mucho más simple y el código será más comprensible.
Por ejemplo, si desea nodos con tipo my_type
que tengan un campo field_foo
con el valor $val
, con Db_Select, haga algo como:
$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();
Lo cual es mucho más simple con EntityFieldQuery:
$query = new EntityFieldQuery;
$entities = $query->entityCondition('entity_type', 'node')
->entityCondition('bundle', 'my_type')
->fieldCondition('field_foo', 'value', $val)
->execute();
Creo que la razón principal prefiriendo EntityFieldQuery
más db_select
es que usted no tiene que saber acerca de la estructura de nivel inferior, en otras palabras: ¿cómo las cosas se almacena en la base de datos. Esto mejora el acoplamiento suelto .
EntityFieldQuery (EFQ) solo devolverá ID de entidad. Si desea acceder a los datos de las entidades, tendrá que llamar entity_load()
, lo que, entre cargar los datos, se asegurará de que se realicen todas las cosas subyacentes que normalmente no le interesan (como cargar campos, llamar a otros módulos, etc.) . Por supuesto, esto da como resultado dos consultas SQL y muchos gastos generales, pero este es el precio a pagar por la abstracción.
En cuanto a que la sintaxis de EFQ sea más clara, creo que es mucho más una cuestión de preferencias personales. Yo, por ejemplo, no creo que EFQ sea más claro. Tenga en cuenta que un db_select()
reemplazo funcional con EFQ debe incluir la prueba del valor de retorno y la entity_load()
llamada posterior , y esto agrega mucho ruido al código, en mi humilde opinión:
$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();
}
Entonces, respondiendo a su pregunta: use EFQ si sus entidades tienen todas las funciones (por ejemplo, son confiables, pueden ser utilizadas por otros módulos, etc.) y / o cree que su sintaxis es más clara. Si otros casos, el uso puede usar db_select()
.
entity_metadata_wrapper()
ayuda aquí. Aún necesita cargar la entidad.
EntityFieldQuery es mucho más limitado que db_select()
, por lo que debe tener una buena razón para no usarlo db_select()
(vea la respuesta de Bart), que es lo suficientemente legible y mucho más flexible.
Por ejemplo, entityFieldQuery
use innerJoin para buscar campos. Si necesita un LeftJoin por cualquier razón, está atrapado ...
http://drupal.org/node/1226622