使用db_query()或db_select()拉入Drupal字段值

时间:2011-12-02 02:23:22

标签: database drupal

我在Drupal 7中创建了一个包含5或6个字段的内容类型。现在我想使用一个函数在hook_view回调中查询它们。我以为我会查询节点表,但我得到的只是nid和title。如何使用数据库抽象API获取我创建的字段的值?

3 个答案:

答案 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);
}
?>

其他资源