我在Drupal 7中创建了一个包含5或6个字段的内容类型。现在我想使用一个函数在hook_view回调中查询它们。我以为我会查询节点表,但我得到的只是nid和title。如何使用数据库抽象API获取我创建的字段的值?
答案 0 :(得分:0)
Drupal将字段存储在其他表中并可以自动加入。存储因字段的配置而异,因此访问它们的最简单方法是使用EntityFieldQuery。它将处理加入所有字段的复杂性。这里有一些很好的例子如何使用它:http://drupal.org/node/1343708
但是如果你在hook_view工作,你应该已经能够访问这些值了,它们被加载到作为参数传入的$ node对象中。尝试运行:
debug($node);
在你的钩子里,你应该看到所有的属性。
答案 1 :(得分:0)
如果您已经知道要加载的节点ID(nid),则应使用node_load_multiple()
加载它们。这将加载所有字段值的完整需求。要搜索节点ID,建议使用EntityFieldQuery
,但它有some limitations。您还可以使用数据库API在node
表中查询节点的nid
(和修订ID,vid
),然后使用node_load_multiple()
加载它们。
加载完整的负载可能会对性能产生影响,因为它会加载比您需要的数据更多的数据。如果证明这是一个问题,您可以尝试直接访问字段存储表(如果您的字段值存储在SQL数据库中)。这些表的模式是对字段类型,基数和其他设置进行了删除 dynamicaly 。您将不得不深入研究数据库模式以找出它。一旦你改变了你的领域,它就可能会改变。
另一种解决方案是构建存根节点实体,并使用field_attach_load()
值$options['field_id']
来仅加载特定字段的值。但这需要对Field API有很好的了解和理解。
答案 2 :(得分:0)
请参阅Drupal社区文档中的How to use EntityFieldQuery文章。
创建查询
这是一个基本查询,查找所有带照片的文章 被标记为特定教员并于今年出版。在里面 在下面的代码的最后5行中,$ result变量填充了 一个关联数组,第一个键是实体类型和 第二个密钥是实体id(例如,$ result ['node'] [12322] = partial 节点数据)。请注意,$ result将没有'node'键 为空,因此使用isset进行检查,这解释为here。
示例:
<?php
$query = new EntityFieldQuery();
$query->entityCondition('entity_type', 'node')
->entityCondition('bundle', 'article')
->propertyCondition('status', 1)
->fieldCondition('field_news_types', 'value', 'spotlight', '=')
->fieldCondition('field_photo', 'fid', 'NULL', '!=')
->fieldCondition('field_faculty_tag', 'tid', $value)
->fieldCondition('field_news_publishdate', 'value', $year. '%', 'like')
->fieldOrderBy('field_photo', 'fid', 'DESC')
->range(0, 10)
->addMetaData('account', user_load(1)); // Run the query as user 1.
$result = $query->execute();
if (isset($result['node'])) {
$news_items_nids = array_keys($result['node']);
$news_items = entity_load('node', $news_items_nids);
}
?>
其他资源