EntityFieldQuery与Db_select()


19

当我可以对Db_select()进行相同的工作以获取值时,为什么还要使用EntityFieldQuery

最好有人提供一个例子,而不仅仅是一个链接。

Answers:


11

我认为关键是语法要简单得多,并且代码将更易于理解。

例如,如果要使用类型my_typefield_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();

14

我认为prefering主要的原因EntityFieldQuerydb_select在于,你不必了解低层结构,换句话说:东西是如何存储在数据库中。这改善了松耦合


6
这是正确的,尽管甚至更进一步。现场存储是可插入的。默认实现将字段数据存储在数据库中每个字段的单独表中,但是可以替换,例如,有一个实现可以将字段数据存储在MongoDB中。如果您希望代码具有可移植性,而不仅仅是在特定的站点配置上运行,则必须使用EntityFieldQuery。
2011年

3

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并仅访问所需的内容。
凯文

我看不到entity_metadata_wrapper()这里有什么帮助。您仍然需要加载实体。
flaviovs

1

EntityFieldQuery的限制远不如db_select(),因此您应该有一个很好的理由不使用db_select()(请参阅bart答案),因为它足够可读并且更加灵活。

例如,entityFieldQuery使用innerJoin来获取字段。如果您出于某种原因需要leftJoin,就会陷入困境... http://drupal.org/node/1226622


好吧,我想知道为什么我的anwser会有一个“ -1”。是的,entityFieldQuery更漂亮,但效率却不如db_select,后者是一个非常好的,健壮且完整的API ...我从代码中删除了很多我的objectFieldQuery,因为它对于特定的用例而言太有限了,认为它绝对值得指出。无论如何。
yann_yinn

1
我认为有些人不喜欢您的答案,因为它无法确认entityFieldQuery是如何在不同存储方法之上的抽象层,这是一个很酷的功能。我在许多站点上工作,我们知道,例如,MySQL始终是x / y / z的数据库,并且在需要时我们也更喜欢编写更精简的db查询。我没有发现除db_select之外,entityFieldQuery更漂亮。页面顶部的2个比较在视觉上几乎相同。
Charlie Schliesser 2013年

是的,这就是为什么我写了“请参阅巴特答案”。除了这种特殊的用例之外,db_select将更加高效并且更加灵活。
yann_yinn 2014年

我完全同意。
查理·施利瑟
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.