Получить только некоторые поля с EntityFieldQuery?

19

Drupal 7 имеет очень многообещающую ORM-подобную систему запросов с EntityFieldQuery.

В настоящее время я понимаю, как сделать выбор узлов, но результат не содержит какой-либо конкретной информации, например, полей, которые я ищу.

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

Таким образом, нам нужно загрузить целые данные узлов, если мы хотим получить только значения одного поля, например, 'field_date' в текущем примере.

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

Если есть способ получить значение полей, вместо этого загрузить полные данные всех узлов, так как это вызывает некоторую перегрузку памяти.

$nodesFieldDates = ???
Федир РЫХТИК
источник

Ответы:

10

Отличный вопрос!

EntityFieldQuery это действительно хорошая вещь, но если вы действительно хотите серьезно, вы должны переопределить класс в пользовательском модуле и добавить в него любое поведение, которое вам нужно.

Я не знаю ваших точных намерений, но я ссылался на эту статью в прошлом. Кредиты Нилу Гастингсу за эту хорошо написанную рецензию.

Посмотрите на примеры кода немного в статье для хороших примеров overiding.

Надеюсь, что это помогает, счастливого кодирования!

stefgosselin
источник
Да я вижу ! Так что, возможно, можно переопределить метод "EntityFieldQuery" и "buildQuery", чтобы чередовать результирующие поля. Возможно, это может сработать.
Федир Рыхтик
11

Я нашел ответ на это! Модуль Apache Solr расширяет класс EntityFieldQuery , чтобы это произошло. Он добавляет новый метод с именем 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();
?>

Если у вас не установлен Apache Solr, просто скопируйте код для расширения этого класса.

mikeytown2
источник
Для этого создал песочницу, так как у модуля Apache Solr были некоторые недостатки: drupal.org/sandbox/mikeytown2/2209909
mikeytown2
2
Проголосовал этот ответ просто за (в настоящее время песочница) модуль, созданный mikeytown2 (спасибо!)
Оливер Коулман
Ссылка в ответе не работает. Там написано «Вам нужно войти или зарегистрироваться перед тем, как продолжить».
mbomb007
@ mbomb007 github.com/AmazeeLabs/apachesolr_attachments/blob/… Обновлена ​​ссылка
mikeytown2
8

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

См. Также Загрузка только одного поля из сущности или узла в Drupal 7 , хорошая статья с примерами того, как это сделать.

jyee
источник
0

Любой, кто все еще хочет получить Fields от EFQ, взглянет на модуль EFQ Extra Fields .

Предупреждение: этот модуль использует EntityFieldQuery для возврата данных из вашей базы данных. Он не работает с сущностями или модулями, которые на них основываются.

Это позволяет вам использовать addField в объекте EntityFieldQueryExtraFields (расширяет объекты EntityFieldQuery). Первоначально EntityFieldQuery возвращает только идентификатор объекта, пакет и тип объекта. Этот модуль добавляет дополнительный слой поверх этого без каких-либо дополнительных entity_loads! Это важно, если вы хотите работать с большими объемами данных и хотите уменьшить количество запросов SQL. Поскольку EFQ уже запрашивает эту информацию в базе данных, почему бы не изменить этот запрос, чтобы также дать вам несколько дополнительных полей. Это означает, что для получения этих данных не будет выполнен ни один дополнительный запрос.

Предупреждение: если вы полагаетесь на какое-либо постформатирование / постзагрузку, которое происходит в entity_load или аналогичных функциях, этот модуль не позаботится об этом. Вы должны сами убедиться в достоверности полученных данных.

пример

Извлечение заголовка узла

$ query = new EntityFieldQueryExtraFields ();
  $ result = $ query-> entityCondition ('entity_type', 'node')
  -> propertyCondition ('type', 'my_bundle_type')
  -> propertyCondition ('status', 1)
  -> addExtraField ('field_myfield', value ', value')
  -> addExtraField ('field_mynodereffield', nid ', nid')
  -> addExtraField ('', 'title', 'title', 'node')
  -> fieldCondition ('field_myfield', 'value', 'some_value_to_filter_on', '=')
  -> Execute ();
Возможные комбинации:
addExtraField ($ field_name, $ column, $ column_alias = NULL, $ table = NULL)

field_name
Укажите, из какого поля должно появиться дополнительное поле. Если это из базовой таблицы, оставьте это пустым и заполните аргумент таблицы

колонка
Укажите название столбца,

column_alias
Укажите псевдоним столбца,

стол
При желании, добавьте что-то вроде узла или пользователя здесь (базовая таблица),
tenken
источник
Я попробовал и этот модуль (EFQ Extra Fields) и модуль (в настоящее время песочница) от mikeytown2, и последний показался намного лучше (более приятный в использовании, более разумный вывод), а также, кажется, поддерживается намного лучше, чем первый. Модуль песочницы mikeytown2 находится по адресу drupal.org/sandbox/mikeytown2/2209909 .
Оливер Коулман