Obtenga solo algunos campos con EntityFieldQuery?

19

Drupal 7 tiene un sistema de consultas ORM muy prometedor con EntityFieldQuery.

Actualmente, entiendo cómo hacer una selección de nodos, pero el resultado no contiene ninguna información específica, como fileds, que estoy buscando.

$query = new EntityFieldQuery();
$entities = $query->entityCondition('entity_type', 'node')
                        ->entityCondition('bundle', 'event')
                        ->propertyCondition('status', 1)
                        ->fieldCondition('field_date', 'value', array('2011-03-01', '2011-03-31'), 'BETWEEN')
                        ->fieldOrderBy('field_date', 'value', 'ASC')
                        ->execute();

Por lo tanto, necesitamos cargar datos completos de nodos, si queremos obtener solo valores de un campo, por ejemplo 'field_date' en el ejemplo actual.

$nodes = entity_load('node', array_keys($entities['node']));

Si hay una manera de obtener el valor de los campos, en lugar de cargar datos completos de todos los nodos, ya que provoca una sobrecarga de memoria.

$nodesFieldDates = ???
Fedir RYKHTIK
fuente

Respuestas:

10

Gran pregunta!

EntityFieldQuery es algo realmente bueno, pero si realmente quieres ponerte serio, debes anular la clase en un módulo personalizado y agregar cualquier comportamiento que necesites hacer allí.

No sé sus intenciones exactas, pero me he referido a este artículo sobre el tema en el pasado. Créditos a Neil Hastings por este artículo bien escrito.

Busque ejemplos de código un poco en el artículo para obtener buenos ejemplos de anulación

Espero que ayude, feliz codificación!

Stefgosselin
fuente
OK veo ! Entonces, probablemente, es posible redefinir el método "buildQuery" "EntityFieldQuery", para alternar los campos resultantes. Probablemente, esto podría funcionar.
Fedir RYKHTIK
11

¡Encontré la respuesta para esto! El módulo Apache Solr extiende la clase EntityFieldQuery para que esto suceda. Agrega un nuevo método llamado addExtraField.

<?php
$query = new ApachesolrAttachmentsEntityFieldQuery();
$entities = $query->entityCondition('entity_type', 'node')
  ->entityCondition('bundle', 'event')
  ->propertyCondition('status', 1)
  ->fieldCondition('field_date', 'value', array('2011-03-01', '2011-03-31'), 'BETWEEN')
  ->fieldOrderBy('field_date', 'value', 'ASC')
  ->addExtraField('field_date', 'value', 'value')
  ->execute();
?>

Si no tiene instalado Apache Solr, simplemente copie el código para extender esa clase.

mikeytown2
fuente
Creé un entorno limitado para esto, ya que el módulo Apache Solr tenía algunos inconvenientes drupal.org/sandbox/mikeytown2/2209909
mikeytown2
2
Votó esta respuesta simplemente para el módulo (actualmente sandbox) creado por mikeytown2 (¡gracias!)
Oliver Coleman
El enlace en la respuesta no parece funcionar. Dice "Debe iniciar sesión o registrarse antes de continuar".
mbomb007
@ mbomb007 github.com/AmazeeLabs/apachesolr_attachments/blob/… Actualizó el enlace
mikeytown2
0

Cualquiera que todavía quiera obtener Campos de un EFQ eche un vistazo al módulo Campos adicionales de EFQ .

Advertencia: Este módulo abusa de EntityFieldQuery para devolver datos de su base de datos. No funciona con entidades ni con ningún módulo que se base en ellas.

Le permite usar addField dentro de un objeto EntityFieldQueryExtraFields (extiende los objetos EntityFieldQuery). Inicialmente, EntityFieldQuery solo le devuelve la identificación de la entidad, el paquete y el tipo de entidad. ¡Este módulo agrega una capa adicional además de eso sin hacer algunas entidades_cargas adicionales! Importante si desea trabajar con grandes cantidades de datos y desea reducir las consultas sql. Dado que EFQ ya consulta la base de datos para obtener esta información, ¿por qué no modificar esa consulta para que también le proporcione algunos campos adicionales? Esto significa que no se realizará una sola consulta adicional para obtener esos datos.

Una advertencia: si confía en algún formateo posterior / carga posterior que ocurre en entity_load o funciones similares, este módulo no se ocupará de eso. Debe garantizar la validez de los datos recuperados.

Ejemplo

Obteniendo el título del nodo

$ query = new EntityFieldQueryExtraFields ();
  $ result = $ query-> entityCondition ('entity_type', 'node')
  -> propertyCondition ('type', 'my_bundle_type')
  -> propertyCondition ('estado', 1)
  -> addExtraField ('field_myfield', valor ', valor')
  -> addExtraField ('field_mynodereffield', nid ', nid')
  -> addExtraField ('', 'título', 'título', 'nodo')
  -> fieldCondition ('field_myfield', 'value', 'some_value_to_filter_on', '=')
  -> ejecutar ();
Posibles combinaciones:
addExtraField ($ field_name, $ column, $ column_alias = NULL, $ table = NULL)

nombre del campo
Especifique de qué campo debe venir el campo adicional. Si es de una tabla base, déjelo vacío y complete el argumento de la tabla

columna
Especifique el nombre de la columna,

column_alias
Especifique el alias de la columna,

mesa
Opcionalmente, agregue algo como nodo o usuario aquí (la tabla base),
Tenken
fuente
He probado tanto este módulo (EFQ Extra Fields) como el módulo (actualmente sandbox) de mikeytown2 y este último parecía mucho mejor (mejor uso, salida más sensible) y también parece mantenerse mucho mejor que el primero. El módulo de miboxtown2 sandbox está en drupal.org/sandbox/mikeytown2/2209909 .
Oliver Coleman el