EntityFieldQuery vs Db_select ()


19

¿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:


11

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_typeque tengan un campo field_foocon 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();

14

Creo que la razón principal prefiriendo EntityFieldQuerymás db_selectes 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 .


66
Esto es correcto, aunque va aún más lejos. El almacenamiento de campo es conectable. La implementación predeterminada almacena datos de campo en una tabla separada por campo en la base de datos, pero se puede reemplazar, por ejemplo, hay una implementación que permite almacenar datos de campo en MongoDB. Si desea que su código sea portátil y no solo funcione en la configuración específica de su sitio, debe usar EntityFieldQuery.
Berdir el

3

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().


No exactamente, puede usar entity_metadata_wrapper y acceder solo a lo que necesita.
Kevin

No veo cómo entity_metadata_wrapper()ayuda aquí. Aún necesita cargar la entidad.
flaviovs

1

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, entityFieldQueryuse innerJoin para buscar campos. Si necesita un LeftJoin por cualquier razón, está atrapado ... http://drupal.org/node/1226622


Bueno, me gustaría saber por qué mi respuesta tenía un "-1". sí, entityFieldQuery es más bonito, pero menos eficiente que db_select, que es una API muy agradable, robusta y completa ... Elimino mucho de mi entityFieldQuery de mi código porque era demasiado limitado para casos de uso específicos, creo que definitivamente merecía ser señaló. De todas formas.
yann_yinn

1
Creo que a algunos no les gusta su respuesta porque no reconoce cómo entityFieldQuery es una capa de abstracción por encima de los diferentes métodos de almacenamiento, que es una característica genial. Trabajo en muchos sitios donde sabemos que, por ejemplo, MySQL siempre será la base de datos para x / y / z y también preferimos escribir consultas db más sencillas cuando sea necesario. No creo que entityFieldQuery sea más bonito que db_select. Las 2 comparaciones en la parte superior de la página son casi idénticas visualmente.
Charlie Schliesser

sí, es por eso que escribí "ver respuesta de bart". Excepto por este caso de uso especial, db_select será más eficiente y mucho más flexible.
yann_yinn

Estoy completamente de acuerdo.
Charlie Schliesser
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.