Допустим, есть словарь с терминами (недавно с ними работал, поэтому с них и начну). У терминов есть дополнительные поля. Мы хотим получить список терминов, у которых значение поля имеет определенное значение.
Для терминов таксономии есть функция 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()):
$query = new EntityFieldQuery();
$query->entityCondition('entity_type', 'node')
->entityCondition('bundle', '')
->propertyCondition('status', 1)
->addTag('random')
->range(0, 1);
/**
* 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», как это было реализовано в примере выше.
- 30.05.2013
- 66 просмотров