it-swarm-es.com

¿Cuál es el uso adecuado de EntityFieldQuery?

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

37
user7

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 (ver field_has_data o _ list_values_in_use () para 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']));
36
Mikey P

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 llamada para obtener 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');
14
electblake

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 las consultas field_data_body no lo harían manualmente.

8
Berdir

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 obtener la ID de la matriz de resultados, puede usar: 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.

0
kenorb