xandeadx.ru Блог музицирующего веб-девелопера

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)
);
Написанное актуально для Drupal 7
Похожие записи

Комментарии RSS

Интересная функция. Но я бы ее немного расширил:

if ($properties) {
  foreach ($properties as $property) {
    $query->propertyCondition($property['name'], $property['value'], $property['condition']);
  }
}

использование:

$node = entity_load_by_conditions(
  'node', array(
    array(
      'name' => 'type',
      'value' => 'page',
      'condition' => '=',
    ),
    array(
      'name' => 'title',
      'value' => 'Foo',
      'condition' => '<>',
    ),
  ),
);

Ну и в том же духе можно попробовать переписать $fields.

Хотя, условия могут быть и сложнее, например:

->fieldCondition('field_date', 'value', array('2012-03-01', '2012-03-31'), 'BETWEEN')

Поэтому функцию можно еще сильнее расширить :)

Сорри, спутал fieldCondition и propertyCondition.

не лишено смысла, но когда речь идёт о загрузке одной сущности, а не списка, то очень редко нужно использовать операторы отличные от "="

По пути CENSORED идёте, господа. отмечу, что это ещё не полная док-ция всех параметров, и только избранные знают, что функция умеет ещё и кофе варить. но нужен ли такой кофе? :)

@kalabro++
Имхо, лучше донести суть EFQ - а не писать к ней оберток :)

new EntityFieldQuery();
isset($result[$entity_type]);
entity_load();

Фактически, функция сокращает лишь эти строки

функция используется в моём парсере. очень удобно в одну строчку получать свойства сущности не зная её id и remote id.
с EntityFieldQuery кода получается сильно больше, причём код во всех случаях по сути одинаковый, а копипаст как известно зло :)

Донесите пожалуйста до меня суть EntityFieldQuery
Хочу получить всех пользователей с определённой ролью и не знаю как?
получить всех, так работает:

  $query = new EntityFieldQuery();
  $query->entityCondition('entity_type', 'user');
  $result = $query->execute(); 
  dsm($result);
  $users = entity_load('user', array_keys($result['user']));
  dsm($users);

никак. пользуйтесь db_select

Спасибо за ответ, вот готовый код: (может кому пригодится)

  $query = db_select('users', 'u');
  $query->innerJoin('users_roles', 'ur', 'u.uid = ur.uid');
  $query->condition('u.status', 0, '!=');
  $query->condition('ur.rid', 3);
  $query->fields('u', array('uid', 'name'));
  $result = $query->execute();
  dsm($result); // queryString - видим запрос к базе
  dsm($result->rowCount()); // Сколько элементов
  if($result->rowCount() > 0) {
    foreach ($result as $value) { 
      // Ну и сам объект пользователя с полями, 
      // которые хотели получить('uid', 'name') 
      dsm($value); 
      break; // Выводим только 1 запись, а то вруг их много...)))
    }
  }

Отличный код! Было бы здорово static кэш прикрутить, entity_load довольно таки тяжёл. Может md5 от аргументов посчитать? Будет ли прок?

у entity_load уже есть static cache

Оставить комментарий

Содержимое этого поля является приватным и не будет отображаться публично. Если у вас есть аккаунт в Gravatar, привязанный к этому e-mail адресу, то он будет использован для отображения аватара.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Доступные HTML теги: <a> <i> <b> <strong> <code> <ul> <ol> <li> <blockquote> <em> <s>
  • Строки и параграфы переносятся автоматически.
  • Подсветка кода осуществляется с помощью тегов: <code>, <css>, <html>, <ini>, <javascript>, <sql>, <php>. Поддерживаемые стили выделения кода: <foo>, [foo].

Подробнее о форматировании