Answers:
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']));
我在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');
这是其中一个测试模块的示例:
这将选择其主体字段以“ A”开头的节点。另请参见EntityFieldQuery :: execute()关于如何使用返回的结果。
有许多用例,典型示例是查询实体以获取特定字段值,如第一个示例中所示的body字段。
优点是,无论您使用的是哪种field_storage,它都可以工作。例如,您可以将您的字段放在MongoDB中,而EntityQuery仍然可以工作,而手动查询field_data_body则不能。
您可以使用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获得更多说明。