当我可以对Db_select()进行相同的工作以获取值时,为什么还要使用EntityFieldQuery。
最好有人提供一个例子,而不仅仅是一个链接。
当我可以对Db_select()进行相同的工作以获取值时,为什么还要使用EntityFieldQuery。
最好有人提供一个例子,而不仅仅是一个链接。
Answers:
我认为关键是语法要简单得多,并且代码将更易于理解。
例如,如果要使用类型my_type
为field_foo
具有以value 命名的字段的节点$val
,并使用Db_Select,yuoll会执行以下操作:
$nids = db_select('node', 'n')
->fields('n', array('nid'))
->join('field_data_field_foo', 'foo', 'foo.entity_id = n.nid')
->condition('n.type', 'my_type')
->condition('foo.field_foo_value', $val)
->execute()->fetchCol();
使用EntityFieldQuery更简单:
$query = new EntityFieldQuery;
$entities = $query->entityCondition('entity_type', 'node')
->entityCondition('bundle', 'my_type')
->fieldCondition('field_foo', 'value', $val)
->execute();
EntityFieldQuery(EFQ)将仅返回实体ID。如果要访问实体数据,则必须调用entity_load()
,它会在加载数据时确保通常不关心的所有基础内容(例如加载字段,调用其他模块的钩子等)已完成。 。当然,这将导致两个 SQL查询和大量开销,但这是为抽象付出的代价。
至于更清晰的EFQ语法,我认为这更多是个人喜好问题。例如,我不认为EFQ更清晰。请注意,db_select()
使用EFQ 的有效替代品必须包括返回值测试和后续entity_load()
调用,这会给代码恕我直言增加很多噪音:
$query = new EntityFieldQuery();
$entities = $query->entityCondition('entity_type', 'node')
->entityCondition('bundle', 'my_type')
->fieldCondition('field_foo', 'value', $val)
->execute();
if (!empty($entities['node'])) {
$nodes = entity_load('node', array_keys($entities['node']));
} else {
$nodes = array();
}
因此,回答您的问题:如果您的实体功能齐全(例如,可现场使用,可由其他模块使用,等等)和/或您认为其语法更清晰,请使用EFQ。如果其他情况,可以使用db_select()
。
entity_metadata_wrapper()
这里有什么帮助。您仍然需要加载实体。
EntityFieldQuery的限制远不如db_select()
,因此您应该有一个很好的理由不使用db_select()
(请参阅bart答案),因为它足够可读并且更加灵活。
例如,entityFieldQuery
使用innerJoin来获取字段。如果您出于某种原因需要leftJoin,就会陷入困境...
http://drupal.org/node/1226622