当前位置: 首页>>技术问答>>正文


EntityFieldQuery vs Db_select()

webfans 技术问答 , , 去评论

问题描述

当我可以使用Db_select()执行相同的工作来获取值时,为什么我应该使用EntityFieldQuery

如果有人能提供一个例子,而不仅仅是一个链接,那会更好。

最佳解决办法

我认为重点是语法更简单,代码更容易理解。

例如,如果您希望类型为my_type的节点具有名为field_foo且值为$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而不是db_select的主要原因是您不必了解lower-level结构,换句话说:数据库中存储的内容如何。这改善了loose coupling

第三种解决办法

EntityFieldQuery(EFQ)仅返回实体ID。如果要访问实体数据,则必须调用entity_load(),在加载数据之间,将确保您通常不关心的所有基础内容(例如加载字段,调用其他模块挂钩等)制作。当然,这导致两个SQL查询和大量开销,但这是为抽象付出的代价。

至于EFQ语法更清晰,我认为这更多是个人偏好的问题。例如,我不认为EFQ更清晰。请注意,使用EFQ替换工作的db_select()必须包含返回值测试和随后的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();
}

所以,回答你的问题:如果你的实体是full-featured(例如可以移动,可以被其他模块使用等)和/或你认为它的语法更清晰,则使用EFQ。如果是其他情况,请使用db_select()

参考资料

本文由朵颐IT整理自网络, 文章地址: https://duoyit.com/article/2473.html,转载请务必附带本地址声明。