有关此背景的信息,请参见http://drupal.org/node/1067802。
考虑到所有这些,在什么情况下我可能想使用db_select(),还是应该仅依靠db_query?
有关此背景的信息,请参见http://drupal.org/node/1067802。
考虑到所有这些,在什么情况下我可能想使用db_select(),还是应该仅依靠db_query?
Answers:
使用SelectQuery的5个理由
您正在建立具有各种条件,联接,字段等的动态查询。有关示例,请参见field_read_fields()。
您想使用所谓的Extenders。示例扩展程序是PagerDefault(代替pager_query())和TableSort(代替tablesort_sql())。这些允许向SelectQuery添加其他功能。另请参阅如何使用来自自定义表的数据用分页器制作可排序的表?。例如:node_page_default()。
您想允许其他模块更改您的查询。然后,您可以添加所谓的标签,并且SelectQuery将自动为该标签调用相应的alter hook。我在Privatemsg模块中高度依赖此功能(我们已经在D6中使用自定义查询生成器完成了此操作)。
如果您希望/需要使用node_access系统仅显示节点,则允许用户查看。只需将'node_access'标记添加到您的$ query中即可。这将替换db_rewrite_sql()。
SelectQuery具有一些功能,可帮助使您的代码在所有受支持的数据库中均相同。例如,存在SelectQuery :: orderRandom()。如果您有LIKE条件,-> condition('field',$ value,'LIKE')将确保它始终是不区分大小写的比较。在D6中,您必须使用LOWER()来完成慢得多的操作。但是AFAIK,目前只有两个。
如果这些原因均不适用于特定情况,请使用db_query()。
关于的文档db_query()
说:
如果它只是一个简单的查询字符串,请将该函数用于SELECT查询。如果调用者或其他模块需要更改查询,请改用db_select()。
我总是使用db_select,因为我倾向于提高可读性,可维护性和跨数据库兼容性,而不是提高性能。此外,我认为上述问题给出的数字对整体表现产生了错误的印象。我们说的查询差异为300微秒,当返回多个列时,查询通常在毫秒级范围内运行。而且,如果只有1次开销(类加载),并且整个(页面)请求的差异要小得多,我也不会感到惊讶。