Яке правильне використання EntityFieldQuery?


37

У Drupal 7 документація API для node_load_multiple()специфікацій, що використовують $conditionsпараметр, застаріла на користь використання EntityFieldQuery. Як можна використовувати клас для створення списку ідентифікаторів вузлів для використання node_load_multiple()? Чи є інші випадки використання для цього?

Відповіді:


36

EntityFieldQuery використовує набір гаків для взаємодії з модулями зберігання польових даних, наприклад, Field SQL Storage, щоб працювати для полів, а також інших властивостей вузла. Довгостроково, EntityFieldQuery - це набагато надійніший спосіб запиту будь-якого типу сутності, а в деяких ситуаціях він може виконувати запити між сутностями (див. Для прикладу field_has_data або _list_values_in_use () .

Ось простий приклад використання EntityFieldQuery для отримання списку всіх вузлів, опублікованих перед певною часовою позначкою:

$query = new EntityFieldQuery();

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

$result = $query->execute();

$ результати цього запиту виглядатимуть приблизно так:

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

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

        )

)

Потім ви можете використовувати цей масив як вхід до node_load_multiple:

$nodes = node_load_multiple(array_keys($result['node']));

3
field_has_data є кращим прикладом imo ніж _list_values_in_use

15

Я знайшов проблему в Drupal щодо додавання прикладів для EntityFieldQuery. Я використовую це для прикладів, а також для висловлення своєї думки щодо заклику для отримання додаткових прикладів.

" Чи потрібен нам приклад EntityFieldQuery? "

У коментарі №11 показано використання node_load_multiple()наведеного нижче:

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

2
Обережно, метод fieldOrderBy залишить усі вузли, у яких пов’язане поле порожнє. Що збиває з пантелику, це передбачається лише сортувати, а не фільтрувати (ви очікуєте, що вузли з порожнім полем будуть знаходитися вгорі або внизу набору результатів). Більше інформації та, сподіваємось, виправлення можна знайти тут drupal.org/node/1611438 та тут drupal.org/node/1662942
Mario Awad

9

Ось приклад одного з тестових модулів:

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

При цьому вибираються вузли, поле тіла яких починається з "А". Дивіться також EntityFieldQuery :: Execute () про те, як використовувати повернений результат.

Існує багато випадків використання, типовим прикладом є запити сутностей щодо конкретного значення поля, такого як поле тіла, як показано в першому прикладі.

Перевага полягає в тому, що він працює в будь-якому польовому сховищі, який ви використовуєте. Наприклад, ви можете мати свої поля в MongoDB і EntityQuery все ще працюватиме, а запит field_data_body вручну не буде.


0

Ви можете використовувати клас EntityFieldQuery для запиту бази даних та отримання результатів у формі списку, подібного до node_load_multiple().

Цього можна досягти, створивши клас, застосувавши умови та виконавши запит, наприклад:

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

Це створить масив, такий як:

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',
    )),
  ),
)

Щоб витягти ідентифікатор з результуючого масиву, ви можете використовувати: current(current($result))->tid.

Ось більш просунутий приклад:

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

Див.: Як використовувати EntityFieldQuery на Drupal.org для отримання додаткового пояснення.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.