Drupal 7 开发内部培训资料, 分头诗人

Drupal 7 里面, EntityFieldQuery 跟 db_select比,哪种查询办法最好呢?

赞成!
0
否决!

我想做出一个模范用户列表,就给user加一个字段

该字段保存在field_data_mofan表了。那么,我想请问一下,在自己写模块编程时,最好的查询办法是哪一个:

1,动态查询db_select('field_data_mofan','fm')->join('user','u','u.uid='fm.etid')

2,用new EntityFieldQuery()这种办法。

请问在上述描述中,哪一种最好,也最常用呢?谢谢了!

5 个回答

赞成!
0
否决!

EntityFieldQuery 跟 db_select 都可以,速度上个人测试过,好像是db_select 快,当然,db_select 也比较麻烦点,但从性能角度看,麻烦一次,换来长久的性能,是很值得的。建议方法1.

赞成!
0
否决!

谢谢诗人兄。我有个疑虑,如果使用动态查询db_select的话,但不用EntityFieldQuery,会不会违反了filed添加字段的初衷?呵呵。

赞成!
0
否决!

drupal 既然留了两种方式,就一定有他的理由的,db_select 不能完全替代EntityFieldQuery,但单从速度看,是db_select 快点的。不过EntityFieldQuery确实是简单很多。

举个例子,如果你有一个内容类型my_type,里面有个字段叫field_foo,然后有一个值是$val,db_select 的方式就这样写:

$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();

这两个方法实现的效果是一样。

赞成!
0
否决!

很多情况下 db_select 比EntityFieldQuery更灵活。举例,entityFieldQuery 用innerJoin 来关联字段,但如果我现在因为某些原因不用innerJoin而改用leftJoin,EntityFieldQuery就会比较麻烦了。

赞成!
0
否决!

但db_select 也有弊端是你必须了解drupal更底层的结构,换种说法就是:数据是如何存储在数据库中。表的结构是如何关联的,这些,在db_select 里面都得了解。

在这个角度看,EntityFieldQuery就有优势了。