EntityFieldQuery Программно получить список сущностей (нод, терминов...) с определенным значением поля


66

Допустим, есть словарь с терминами (недавно с ними работал, поэтому с них и начну). У терминов есть дополнительные поля. Мы хотим получить список терминов, у которых значение поля имеет определенное значение.

Для терминов таксономии есть функция taxonomy_term_load_multiple($tids = array(), $conditions = array()). В параметре $conditions можно передавать ассоциативный массив 'имя поля'=>'значение поля' для фильтрации терминов, например:

taxonomy_term_load_multiple(array(), array('vid' => $vid));

​Один маленький нюанс - поля можно указывать только те, что хранятся в таблице 'taxonomy_term_data'. Значит эта функция нам не поможет.

Нам на помощь придет класс EntityFieldQuery. Этот класс позволяет находить сущности на основании их свойств (значений полей).

Приведу пример кода для поставленной задачи:
$query = new EntityFieldQuery();
 $query
    ->entityCondition('entity_type', 'taxonomy_term')  //определим, какой тип сушности выводим
    ->propertyCondition('vid', 'номер словаря')  //ограничим словарь
    ->fieldCondition('имя поля', 'value', 'значение поля', '=');  //укажем значение поля
 $result = $query->execute();

Сортировка результатов

Сортировка по свойствам сущности:

EntityFieldQuery::propertyOrderBy($column, $direction = 'ASC')

Сортировка по полям сущности:

EntityFieldQuery::fieldOrderBy($field, $column, $direction = 'ASC')

Интересеный вариант, как добавить случайную сортировку к запросу (используется hook_query_TAG_alter()): 

1. Добавляем к запросу тег 'random'
$query = new EntityFieldQuery();
$query->entityCondition('entity_type', 'node')
  ->entityCondition('bundle', '')
  ->propertyCondition('status', 1)
  ->addTag('random')
  ->range(0, 1);
2. Меняем запрос с тегом random
/**
 * Implementation of hook_query_TAG_alter
 */
function _query_random_alter($query) {
  $query->orderRandom();
}

Пример для Drupal 8

Получить идентификаторы всех опубликованных нод типа poem или fairy_tale, которые в тизере поля body содержат фразу «У лукоморья дуб зеленый», помечены тремя и более тегами, один из которых «Сказки Пушкина», и опубликованы пользователем с идентификатором 1799 в течение последней недели.

$query = \Drupal::entityQuery('node');
$query->condition('type', ['poem', 'fairy_tale'], 'IN');
$query->condition('body.summary', 'У лукоморья дуб зеленый', 'CONTAINS');
$query->condition('field_tags.%delta', 2);
$query->condition('field_tags.entity:taxonomy_term.name', 'Сказки Пушкина');
$query->condition('uid', 1799);
$query->condition('created', time() - 604800, '>');
$query->condition('status', 1);
$nids = $query->execute();

Стоит отметить, что такие значения параметра field, как body и body.value будут идентичны, так как value является столбцом по умолчанию. В случае multiple-поля можно определять условие относительно конкретного значения с помощью указания дельты. Например, параметр field_tags.7 будет указывать на восьмое значение поля field_tags. Кроме того, можно задать условие для самой дельты, используя «%delta», как это было реализовано в примере выше.

Добавить комментарий
Может быть интересно
Модуль Migrate это фреймворк для миграции (импорта) данных в Drupal из любых источников.
1

В данной статье будет теория про механизм, который использует модуль migrate при импорте материалов в Друпал из различных источников.

2

В операционной системе Windows, как и в других операционных системах, интерактивные (набираемые с клавиатуры и сразу же выполняемые) команды выполняются с помощью так называемого командного интерпретатора, иначе называемого командным процессором или оболочкой командной строки (command shell).

3
Иногда при разработке сайта появляется необходимость создавать отдельный шаблон для определенной ноды. По умолчанию такой возможности нет, зато можно это прикрутить самостоятельно. Как это сделать? Это можно узнать в данной статье.

В данной статье пойдет речь о таких командах, как: CD, COPY | XCOPY, DIR, MKDIR | RMDIR, DEL, REN, MOVE.

Полный список команд можно вывести набрав HELP в командной строке.

2