EntityFieldQuery的正确用法是什么?


37

在Drupal 7中,不赞成node_load_multiple()使用using $conditions参数指定API文档,而推荐使用using EntityFieldQuery。如何使用该类来生成供其使用的节点ID列表node_load_multiple()?还有其他用例吗?

Answers:


36

EntityFieldQuery使用一组挂钩与字段存储模块(例如Field SQL Storage)进行接口连接,以便为字段以及其他节点属性工作。从长远来看,EntityFieldQuery是一种查询任何类型的实体的可靠方法,并且在某些情况下,它可以执行跨实体查询(有关示例,请参见field_has_data_list_values_in_use()

这是一个使用EntityFieldQuery获取特定时间戳之前发布的所有节点的列表的简单示例:

$query = new EntityFieldQuery();

$query
  ->entityCondition('entity_type', 'node', '=')
  ->propertyCondition('status', 1, '=')
  ->propertyCondition('created', '1294694496', '<');

$result = $query->execute();

该查询的$ results看起来像这样:

Array
(
    [node] => Array
        (
            [1] => stdClass Object
                (
                    [nid] => 1
                    [vid] => 49
                    [type] => article
                )

            [2] => stdClass Object
                (
                    [nid] => 2
                    [vid] => 2
                    [type] => page
                )

        )

)

然后,您可以使用该数组作为node_load_multiple的输入:

$nodes = node_load_multiple(array_keys($result['node']));

3
field_has_data是比_list_values_in_use更好的imo示例

15

我在Drupal上发现了一个有关为添加示例的问题EntityFieldQuery。我一直在使用它作为示例,并在征集更多示例时表达我的观点。

我们需要一个EntityFieldQuery示例吗?

评论#11的显示,使用node_load_multiple()所见如下:

$query = new EntityFieldQuery();
$entities = $query->entityCondition('entity_type', 'node')
                        ->entityCondition('bundle', 'event')
                        ->propertyCondition('status', 1)
                        ->fieldCondition('field_date', 'value', array('2011-03-01', '2011-03-31'), 'BETWEEN')
                        ->fieldOrderBy('field_date', 'value', 'ASC')
                        ->execute();

$nodes = entity_load('node', array_keys($entities['node']));
return node_view_multiple($nodes, 'teaser');

2
注意,fieldOrderBy方法将忽略具有相关字段为空的所有节点。令人困惑的原因是,这仅应排序而不是过滤(您希望带有空字段的节点位于结果集的顶部或底部)。更多信息和希望修复程序可以在以下位置找到:drupal.org/node/1611438和此处drupal.org/node/1662942
Mario Awad 2012年

9

这是其中一个测试模块的示例:

http://api.drupal.org/api/drupal/modules--node--tests--node_access_test.module/function/node_access_entity_test_page/7

这将选择其主体字段以“ A”开头的节点。另请参见EntityFieldQuery :: execute()关于如何使用返回的结果。

有许多用例,典型示例是查询实体以获取特定字段值,如第一个示例中所示的body字段。

优点是,无论您使用的是哪种field_storage,它都可以工作。例如,您可以将您的字段放在MongoDB中,而EntityQuery仍然可以工作,而手动查询field_data_body则不能。


0

您可以使用EntityFieldQuery类查询数据库并以类似于的列表形式获取结果node_load_multiple()

这可以通过创建一个类,应用条件并执行查询来实现,例如:

<?php
$query = new EntityFieldQuery();
$query
  ->entityCondition('entity_type', 'TYPE') // E.g. node, entityform, taxonomy_term
  ->entityCondition('bundle', 'BUNDLE')
  ->fieldCondition('field_foo', 'value', 'STRING')
  ->range(0,10);
$result = $query->execute();
?>

这将生成如下数组:

array (
  'TYPE' =>
  array (
    123 =>
    stdClass::__set_state(array(
       'nid' => '123', // Can be also tid when loading terms.
       'key' => 'value',
    )),
    456 =>
    stdClass::__set_state(array(
       'nid' => '456',
       'key' => 'value',
    )),
  ),
)

要从结果数组中获取ID,可以使用:current(current($result))->tid

这是更高级的示例:

<?php
$query = new EntityFieldQuery();

$query->entityCondition('entity_type', 'node')
  ->entityCondition('bundle', 'article')
  ->propertyCondition('status', NODE_PUBLISHED)
  ->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);
}
?>

请参阅:如何在Drupal.org 上使用EntityFieldQuery获得更多说明。

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.