原文地址:https://www.drupal.org/node/93737
Drupal6中的db_rewrite_sql()函数,和Drupal7里的db_select()加上'node_access'的tagged方法,可以为模块提供了一个方法来来扩展SQL查询。
注:Drupal7 中的db_select()的tagged方法:
$query = db_select('node', 'n') ->addTag('node_access');
例如,一个模块控制节点访问,但需要限制查询结果,排除访问者不具有该节点访问权限的所有节点。
如果你不使用db_rewrite_sql()或其 ->addTag方法,访问控制模块将不能够修改或扩展您的SQL查询,你可能会在不经意间展示出要限制的内容。
这是很好的习惯,去使用db_rewrite_sql() 或 ->addTag() 方法来做查询。
[注:这里有篇文章提出了异议(#835068: Document usage of static vs dynamic queries) ,有关是否应该总是使用db_select()函数的。重要的一点,当你要查询的node数据表时,需要其他模块来执行节点的访问限制,在Drupal7 的唯一方法是使用db_select->addTag()。
但也有一些例外情况, 如:
- 在内部模块中进行查询,但不负责为用户展示内容(例如,cron任务查询)。
- 管理页面中进行查询,需要显示一个未过滤列表,并且用户已经得到了授权权限。