¿Cuál es el uso adecuado de EntityFieldQuery?

37

En Drupal 7, la documentación de la API para node_load_multiple()especificar el uso del $conditionsparámetro ha quedado en desuso a favor del uso EntityFieldQuery. ¿Cómo se usa la clase para generar una lista de ID de nodo para usar node_load_multiple()? ¿Hay otros casos de uso para ello?

Andre Baumeier
fuente

Respuestas:

36

EntityFieldQuery usa un conjunto de enlaces para interactuar con los módulos de almacenamiento de campo, como Field SQL Storage, para trabajar para campos y otras propiedades de nodo. A largo plazo, EntityFieldQuery es una forma mucho más confiable de consultar cualquier tipo de entidad, y en algunas situaciones puede realizar consultas entre entidades (consulte field_has_data o _list_values_in_use () para ver un ejemplo.

Aquí hay un ejemplo simple del uso de EntityFieldQuery para obtener una lista de todos los nodos publicados antes de una marca de tiempo específica:

$query = new EntityFieldQuery();

$query
  ->entityCondition('entity_type', 'node', '=')
  ->propertyCondition('status', 1, '=')
  ->propertyCondition('created', '1294694496', '<');

$result = $query->execute();

$ resultados de esa consulta se verían así:

Array
(
    [node] => Array
        (
            [1] => stdClass Object
                (
                    [nid] => 1
                    [vid] => 49
                    [type] => article
                )

            [2] => stdClass Object
                (
                    [nid] => 2
                    [vid] => 2
                    [type] => page
                )

        )

)

Entonces podría usar esa matriz como entrada para node_load_multiple:

$nodes = node_load_multiple(array_keys($result['node']));
Mikey P
fuente
3
field_has_data es un ejemplo más agradable que _list_values_in_use
15

Encontré un problema en Drupal sobre agregar ejemplos para EntityFieldQuery. Lo he estado usando para ejemplos, así como para expresar mi opinión sobre la convocatoria de más ejemplos.

" ¿Necesitamos un ejemplo de EntityFieldQuery? "

El comentario # 11 muestra el uso de node_load_multiple()como se ve a continuación:

$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();

$nodes = entity_load('node', array_keys($entities['node']));
return node_view_multiple($nodes, 'teaser');
electblake
fuente
2
Precaución, el método fieldOrderBy dejará fuera cualquier nodo que tenga el campo relacionado vacío. Lo cual es confuso porque se supone que esto solo ordena y no filtra (esperaría que los nodos con el campo vacío estén en la parte superior o inferior del conjunto de resultados). Puede encontrar más información y, con suerte, una solución aquí drupal.org/node/1611438 y aquí drupal.org/node/1662942
Mario Awad
9

Aquí hay un ejemplo de uno de los módulos de prueba:

http://api.drupal.org/api/drupal/modules--node--tests--node_access_test.module/function/node_access_entity_test_page/7

Esto selecciona nodos cuyo campo de cuerpo comienza con "A". Vea también EntityFieldQuery :: execute () sobre cómo usar el resultado devuelto.

Hay muchos casos de uso, el ejemplo típico es consultar entidades para un valor de campo específico como el campo del cuerpo como se muestra en el primer ejemplo.

La ventaja es que funciona independientemente del campo_almacenamiento que esté utilizando. Por ejemplo, puede hacer que sus campos en MongoDB y EntityQuery sigan funcionando mientras que la consulta de field_data_body no lo haría manualmente.

Berdir
fuente
0

Puede usar la clase EntityFieldQuery para consultar la base de datos y obtener los resultados en forma de lista similar a node_load_multiple().

Esto se puede lograr creando una clase, aplicando las condiciones y ejecutando la consulta, por ejemplo:

<?php
$query = new EntityFieldQuery();
$query
  ->entityCondition('entity_type', 'TYPE') // E.g. node, entityform, taxonomy_term
  ->entityCondition('bundle', 'BUNDLE')
  ->fieldCondition('field_foo', 'value', 'STRING')
  ->range(0,10);
$result = $query->execute();
?>

Esto generará la matriz como:

array (
  'TYPE' =>
  array (
    123 =>
    stdClass::__set_state(array(
       'nid' => '123', // Can be also tid when loading terms.
       'key' => 'value',
    )),
    456 =>
    stdClass::__set_state(array(
       'nid' => '456',
       'key' => 'value',
    )),
  ),
)

Para buscar el ID de la matriz de resultados, puede utilizar: current(current($result))->tid.

Aquí hay un ejemplo más avanzado:

<?php
$query = new EntityFieldQuery();

$query->entityCondition('entity_type', 'node')
  ->entityCondition('bundle', 'article')
  ->propertyCondition('status', NODE_PUBLISHED)
  ->fieldCondition('field_news_types', 'value', 'spotlight', '=')
  ->fieldCondition('field_photo', 'fid', 'NULL', '!=')
  ->fieldCondition('field_faculty_tag', 'tid', $value)
  ->fieldCondition('field_news_publishdate', 'value', $year . '%', 'like')
  ->fieldOrderBy('field_photo', 'fid', 'DESC')
  ->range(0, 10)
  ->addMetaData('account', user_load(1)); // Run the query as user 1.

$result = $query->execute();

if (isset($result['node'])) {
  $news_items_nids = array_keys($result['node']);
  $news_items = entity_load('node', $news_items_nids);
}
?>

Consulte: Cómo usar EntityFieldQuery en Drupal.org para obtener más explicaciones.

kenorb
fuente