Как я могу получить связку сущности от типа и идентификатора?

11

Мне нужно идентифицировать bundleсущность из ее typeи id.

Например, если typeэто «узел» и id7, я могу получить «страницу» как bundle.

Спасибо

Junaid
источник

Ответы:

11

Используйте entity_loadдля загрузки объекта, как упомянуто @Nikhil.

Затем используйте entity_extract_ids , чтобы извлечь пакет. Пример:

$entity = entity_load('node', array('7'));

list(, , $bundle) = entity_extract_ids('node', $entity);

echo "Bundle name is : " . $bundle;

Функция entity_extract_idsвозвращает численно индексированный массив (не хеш-таблицу), содержащий элементы:

  • 0: основной идентификатор объекта.
  • 1: идентификатор редакции объекта или NULL, если $ entity_type не является версионным.
  • 2: имя пакета или NULL, если у $ entity_type нет пакетов.

где, 0, 1, и 2являются индексы массива. Тем не менее, подход, используемый модулями core и contrib, заключается в использовании list()функции.

AjitS
источник
Я думаю, что это не хорошо, чтобы зависеть от числового индекса массива.
Джунаид
3
@Junaid Этот индекс предсказуем, так что все в порядке. Вот как ядро ​​Drupal справляется с этой задачей. Если «магическое число» беспокоит, вы просто используете языковые функции:list($id, $vid, $bundle) = entity_extract_ids($entity_type, $entity);
Клайв
@Junaid Вы можете зависеть от числового индекса, когда вы уверены, что они не изменятся. Смотрите редактирование для объяснения того, почему я использовал числовой индекс. Это потому, что функция API разработана таким образом. Также решение не зависит от сущностного модуля ;-)
AjitS
7

Вот самый чистый, который я получил из кода модуля Organic groups.

$wrapper = entity_metadata_wrapper($entity_type, $entity_id);
$bundle = $wrapper->getBundle();

Например, я могу назвать это так:

$wrapper = entity_metadata_wrapper('node', 1);
$bundle = $wrapper->getBundle();

Редактировать: как указывал @Clive, метод выше зависит от модуля сущности.

Вот еще один метод, который не зависит от какого-либо дополнительного модуля. Это объясняется здесь https://forrst.com/posts/Get_the_bundle_of_a_Drupal_7_entity-0xW

Скопируйте и вставьте этот метод:

function _entity_get_bundle($entity, $entity_type) {
  $info = entity_get_info($entity_type);
  if (empty($info['entity keys']['bundle'])) {
    return $entity_type;
  } else {
    return $entity->{$info['entity keys']['bundle']};
  }
}
Junaid
источник
Что такое $group_type, $gid? а в чем ценность $bundle ?
Никсмак
Извините, я забыл использовать правильные имена параметров. Исправлено сейчас.
Джунаид
Вы можете сделать то же самое для entity_load, кстати, как его самое чистое?
Никсмак
1
Лично я не думаю, что entity_metadata_wrapper()это чище, чем entity_extract_ids()метод. Кроме того, вы полагаетесь на устанавливаемый модуль сущности ...
Клайв
Это не обязательно чище, но это правильная альтернатива, особенно если вы все равно используете обертки метаданных. Может быть, @develkar или Junaid могли бы отредактировать свой ответ, чтобы включить обе альтернативы? (Джунаид, может быть, вы могли бы добавить ссылки на модуль Entity и на страницу о entity_metadata_wrappers?)
Алиса Хитон,
3

Попробуйте entity_load

Загрузка сущностей из базы данных.

Объекты хранятся в статическом кэше памяти и не требуют доступа к базе данных, если загружаются снова во время того же запроса страницы.

параметры

$ entity_type : тип объекта для загрузки, например, узел или пользователь.

$ ids : массив идентификаторов сущностей или FALSE для загрузки всех сущностей.

$ condition : (устарело) Ассоциативный массив условий в базовой таблице, где ключи - это поля базы данных, а значения - значения, которые должны иметь эти поля. Вместо этого предпочтительно использовать EntityFieldQuery для получения списка идентификаторов сущностей, загружаемых этой функцией.

$ reset : сбросить ли внутренний кэш для запрошенного типа объекта.

Возвращаемое значение

Массив объектов-сущностей, проиндексированных по их идентификаторам. Если результатов не найдено, возвращается пустой массив.

niksmac
источник
3

Если вам нужен очень легкий способ получения типа узла по идентификатору узла с точки зрения производительности - вы можете использовать один запрос на выборку для таблицы узлов.

$type = db_query("SELECT type FROM {node} WHERE nid = :nid", 
                  array(':nid' => $nid))->fetchField();

Таким образом, вам не нужно вызывать всю систему ловушек сущностей, с entity_load и т. Д.

Это один запрос на выборку, использующий индексированный идентификатор узла.

Дэвид Томас
источник
мы не играем только с узлами здесь.
Джунаид
ОП пишет: «Например, если тип« узел », а идентификатор равен 7, я могу получить« страницу »в виде пакета». отсюда и пример ответа на основе узла.
Дэвид Томас