Функция, которая возвращает объект сущности по значениям её свойств и полей:
/**
* 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)
);
Написанное актуально для
Drupal 7
Комментарии
Интересная функция. Но я бы ее немного расширил:
использование:
Ну и в том же духе можно попробовать переписать $fields.
Хотя, условия могут быть и сложнее, например:
Поэтому функцию можно еще сильнее расширить :)
Сорри, спутал fieldCondition и propertyCondition.
не лишено смысла, но когда речь идёт о загрузке одной сущности, а не списка, то очень редко нужно использовать операторы отличные от "="
По пути CENSORED идёте, господа. отмечу, что это ещё не полная док-ция всех параметров, и только избранные знают, что функция умеет ещё и кофе варить. но нужен ли такой кофе? :)
@kalabro++
Имхо, лучше донести суть EFQ - а не писать к ней оберток :)
Фактически, функция сокращает лишь эти строки
функция используется в моём парсере. очень удобно в одну строчку получать свойства сущности не зная её id и remote id.
с EntityFieldQuery кода получается сильно больше, причём код во всех случаях по сути одинаковый, а копипаст как известно зло :)
Донесите пожалуйста до меня суть EntityFieldQuery
Хочу получить всех пользователей с определённой ролью и не знаю как?
получить всех, так работает:
никак. пользуйтесь db_select
Спасибо за ответ, вот готовый код: (может кому пригодится)
Отличный код! Было бы здорово static кэш прикрутить, entity_load довольно таки тяжёл. Может md5 от аргументов посчитать? Будет ли прок?
у entity_load уже есть static cache
Добавить комментарий