Qual é o uso adequado do EntityFieldQuery?

37

No Drupal 7, a documentação da API para node_load_multiple()especifica o uso do $conditionsparâmetro foi descontinuada em favor do uso EntityFieldQuery. Como alguém usa a classe para gerar uma lista de IDs de nós para uso node_load_multiple()? Existem outros casos de uso para isso?

Andre Baumeier
fonte

Respostas:

36

O EntityFieldQuery usa um conjunto de ganchos para fazer interface com os módulos de armazenamento de campo, como o Armazenamento em Campo SQL, para trabalhar com campos e outras propriedades do nó. A longo prazo, EntityFieldQuery é uma maneira muito mais confiável de consultar qualquer tipo de entidade e, em algumas situações, pode executar consultas entre entidades (consulte field_has_data ou _list_values_in_use () para obter um exemplo.

Aqui está um exemplo simples de uso do EntityFieldQuery para obter uma lista de todos os nós publicados antes de um carimbo de data / hora específico:

$query = new EntityFieldQuery();

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

$result = $query->execute();

Os resultados $ dessa consulta se pareceriam com isso:

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

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

        )

)

Você poderia usar essa matriz como entrada para node_load_multiple:

$nodes = node_load_multiple(array_keys($result['node']));
Mikey P
fonte
3
field_has_data é um exemplo mais agradável do que imo _list_values_in_use
15

Encontrei um problema no Drupal sobre como adicionar exemplos para EntityFieldQuery. Eu tenho usado isso para exemplos, bem como para expressar minha opinião na solicitação de mais exemplos.

" Precisamos de um exemplo de EntityFieldQuery? "

O comentário # 11 mostra o uso de node_load_multiple()como visto abaixo:

$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
fonte
2
Cuidado, o método fieldOrderBy deixará de fora todos os nós que tiverem o campo relacionado vazio. O que é confuso, porque isso deve classificar e não filtrar (você esperaria que os nós com o campo vazio estivessem na parte superior ou inferior do conjunto de resultados). Mais informações e, esperançosamente, uma correção pode ser encontrada aqui drupal.org/node/1611438 e aqui drupal.org/node/1662942
Mario Awad
9

Aqui está um exemplo de um dos módulos de teste:

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

Isso seleciona nós cujo campo do corpo começa com "A". Consulte também EntityFieldQuery :: execute () sobre como usar o resultado retornado.

Existem muitos casos de uso, o exemplo típico é consultar entidades para obter um valor de campo específico, como o campo body, como mostrado no primeiro exemplo.

A vantagem é que ele funciona em qualquer armazenamento de campo que você estiver usando. Por exemplo, você pode ter seus campos no MongoDB e o EntityQuery ainda funcionará, enquanto a consulta manual de field_data_body não funcionaria.

Berdir
fonte
0

Você pode usar a classe EntityFieldQuery para consultar o banco de dados e buscar os resultados em forma de lista semelhante a node_load_multiple().

Isso pode ser conseguido criando uma classe, aplicando as condições e executando a consulta, por exemplo:

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

Isso irá gerar a 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 a identificação da matriz resultado, você pode usar: current(current($result))->tid.

Aqui está um exemplo mais avançado:

<?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);
}
?>

Veja: Como usar o EntityFieldQuery no Drupal.org para obter mais explicações.

kenorb
fonte