Drupal → Универсальная функция загрузки сущности по значениям её свойств и полей
Функция, которая возвращает объект сущности по значениям её свойств и полей:
/** * Return entity object by conditions. */ function entity_load_by_conditions($entity_type, $properties = NULL, $fields = NULL) { $query = new EntityFieldQuery(); $query->entityCondition('entity_type', $entity_type); if ($properties) { foreach ($properties as $name => $value) { $query->propertyCondition($name, $value); } } if ($fields) { foreach ($fields as $name => $values) { foreach ($values as $column => $value) { $query->fieldCondition($name, $column, $value); } } } $query->range(0, 1); $result = $query->execute(); if ($result) { $id = key($result[$entity_type]); $entities = entity_load($entity_type, array($id)); return reset($entities); } }
Примеры использования:
// Получить ноду типа page с заголовком Foo и значением поля field_category равным 2 $node = entity_load_by_conditions( 'node', array('type' => 'page', 'title' => 'Foo'), array('field_category' => array('tid' => 2)) ); // Получить термин с именем Foo из словаря с vid=3 $term = entity_load_by_conditions( 'taxonomy_term', array('name' => 'Foo', 'vid' => 3) );
Комментарии
Интересная функция. Но я бы ее немного расширил:
использование:
Ну и в том же духе можно попробовать переписать $fields.
Хотя, условия могут быть и сложнее, например:
Поэтому функцию можно еще сильнее расширить :)
Сорри, спутал fieldCondition и propertyCondition.
не лишено смысла, но когда речь идёт о загрузке одной сущности, а не списка, то очень редко нужно использовать операторы отличные от "="
По пути CENSORED идёте, господа. отмечу, что это ещё не полная док-ция всех параметров, и только избранные знают, что функция умеет ещё и кофе варить. но нужен ли такой кофе? :)
@kalabro++
Имхо, лучше донести суть EFQ - а не писать к ней оберток :)
Фактически, функция сокращает лишь эти строки
функция используется в моём парсере. очень удобно в одну строчку получать свойства сущности не зная её id и remote id.
с EntityFieldQuery кода получается сильно больше, причём код во всех случаях по сути одинаковый, а копипаст как известно зло :)
Донесите пожалуйста до меня суть EntityFieldQuery
Хочу получить всех пользователей с определённой ролью и не знаю как?
получить всех, так работает:
никак. пользуйтесь db_select
Спасибо за ответ, вот готовый код: (может кому пригодится)
Отличный код! Было бы здорово static кэш прикрутить, entity_load довольно таки тяжёл. Может md5 от аргументов посчитать? Будет ли прок?
у entity_load уже есть static cache
Оставить комментарий