如何从类型和ID中获取实体捆绑?


11

我需要bundletype和中确定一个实体id

例如,如果typeis为'node'且id为7,则可能将'page'表示为bundle

谢谢

Answers:


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:实体的主要ID。
  • 1:实体的修订版ID;如果未设置$ entity_type的版本,则为NULL。
  • 2:实体的捆绑包名称;如果$ entity_type没有捆绑包,则为NULL。

其中,01,和2是数组索引。但是,核心模块和贡献模块使用的list()方法是使用该功能。


我认为依赖数组数字索引不是很好。
Junaid 2013年

3
@Junaid该索引是可预测的,所以很好。这就是Drupal核心处理此任务的方式。如果“魔术数字”困扰您,您仅使用语言功能:list($id, $vid, $bundle) = entity_extract_ids($entity_type, $entity);
克莱夫(Clive)

@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']};
  }
}

什么$group_type, $gid啊 什么是价值$bundle
niksmac

抱歉,我忘记使用正确的参数名称。现在已更正。
Junaid 2013年

您可以这样做entity_load,但它最干净吗?
niksmac

1
我个人认为没有entity_metadata_wrapper()比该entity_extract_ids()方法更干净的方法。另外,您还依赖于要安装的实体模块...
克莱夫(Clive)

它不一定更清洁,但它是一种有效的替代方法,尤其是在您无论如何都使用元数据包装器的情况下。也许@develkar或Junaid可以编辑其答案以包括这两种选择?(Junaid,也许您也可以将链接添加到Entity模块和有关Entity_metadata_wrappers的页面上?)
爱丽丝·希顿

3

尝试entity_load

从数据库加载实体。

这些实体存储在静态内存缓存中,如果在同一页面请求期间再次加载,则不需要数据库访问。

参量

$ entity_type:要加载的实体类型,例如节点或用户。

$ ids:实体ID的数组,或FALSE,用于加载所有实体。

$ conditions:(不建议使用)基表上的条件的关联数组,其中键是数据库字段,而值是这些字段必须具有的值。相反,最好使用EntityFieldQuery检索此功能可加载的实体ID的列表。

$ reset:是否为请求的实体类型重置内部缓存。

返回值

由其ID索引的实体对象数组。如果找不到结果,则返回一个空数组。


3

如果您想要一种非常轻量级的方式(从性能角度来看),以从节点ID获取节点类型-您可以在节点表上使用单个选择查询。

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

这样,您无需使用entity_load等来调用整个实体挂钩系统。

这是一个使用索引节点ID的单一选择查询。


我们不只在这里玩节点。
Junaid 2014年

OP写道:“例如,如果类型为'node'并且id为7,则可能将'page'作为包。” 因此,基于节点的示例答案。
大卫·托马斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.