Отримати лише кілька полів за допомогою 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 це справді хороший матеріал, але якщо ви дійсно хочете отримати серйозний характер, вам слід перекрити клас у спеціальному модулі та додати будь-яку поведінку, яка вам там потрібна.

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

Шукайте приклади коду трохи в статті, щоб отримати приємні приклади перекриття.

Сподіваюся, що допомагає, щасливе кодування!


Добре, я бачу ! Тому, ймовірно, можливо переосмислити метод "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, просто скопіюйте код для розширення цього класу.


Створено пісочницю для цього , як модуль 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 , хорошу статтю із прикладами того, як це зробити.


0

Усі, хто все ще хоче отримати Поля від EFQ, перегляньте модуль додаткових полів EFQ .

Попередження: Цей модуль зловживає EntityFieldQuery для повернення даних із вашої бази даних. Він не працює з сутностями або будь-якими модулями, які будуються на них.

Це дозволяє використовувати addField в межах об’єкта EntityFieldQueryExtraFields (розширює об’єкти EntityFieldQuery). Спочатку EntityFieldQuery повертає лише ідентифікатор, пакет та тип сутності. Цей модуль додає додатковий шар поверх цього, не роблячи зайвих суто_груз! Важливо, якщо ви хочете працювати з великою кількістю даних і хочете зменшити запити sql. Оскільки EFQ вже запитує базу даних для цієї інформації, чому б не змінити цей запит, щоб він також дав вам додаткові поля. Це означає, що для отримання цих даних не буде виконано жодного додаткового запиту.

Слово обережності, якщо ви покладаєтесь на якийсь постформатування / пост-завантаження, що відбувається в entit_load або подібних функціях, цей модуль не піклується про це. Ви повинні самі забезпечити обгрунтованість отриманих даних.

Приклад

Отримання заголовка вузла

$ query = новий EntityFieldQueryExtraFields ();
  $ result = $ query-> objectCondition ('сутність_типу', 'вузол')
  -> propertyCondition ('тип', 'my_bundle_type')
  -> propertyCondition ('статус', 1)
  -> addExtraField ('field_myfield', значення ', значення')
  -> 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)

ім'я поля
Вкажіть, з якого поля повинно надходити додаткове поле. Якщо це з базової таблиці, залиште його порожнім і заповніть аргумент таблиці

стовпчик
Вкажіть назву стовпця,

column_alias
Вкажіть псевдонім стовпця,

стіл
За бажанням додайте сюди щось на кшталт вузла або користувача (основна таблиця),

Я спробував і цей модуль (EFQ Extra Fields), і модуль (зараз пісочниця) від mikeytown2, і останній здався набагато кращим (приємніше використовувати, більш розумний вихід), а також, здається, підтримується набагато краще, ніж перший. Модуль пісочної скриньки mikeytown2 знаходиться за адресою drupal.org/sandbox/mikeytown2/2209909 .
Олівер Коулман
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.