You are here

40 hook_query_alter()

admin 的头像
Submitted by admin on 星期二, 2015-06-09 03:06

作者:老葛,北京亚艾元软件有限责任公司,http://www.yaiyuan.com

    标签化和元数据本身并不起任何作用。它们的存在就是为hook_query_alter()提供信息,在hook_query_alter()中,可对选择查询作任何修改。

    所有的动态选择对象都是通过execute()方法,在查询字符串被编译之前,传递给hook_query_alter()的。这就为模块提供了一个机会,方便它们按照自己的需要来操作查询。hook_query_alter()接收单个参数:选择查询对象本身。

<?php
/**

* 实现hook_query_alter()
*/
function example_query_alter(QueryAlterableInterface $query) {
  // ...
}
?>

    还有一个特定于标签的alter钩子,hook_query_TAG_NAME_alter(),它会在通用的alter钩子调用后,对于给定查询具有的所有标签,调用这个钩子。对于拥有标签'node_access'的查询,会为其调用下面的代码:

<?php
function example_query_node_access_alter(QueryAlterableInterface $query) {
  // ...
}
?>

对于hook_query_alter(),有两点需要明确一下。

1. $query参数不是通过引用传递的。由于它本身是一个对象,由于PHP5及后续版本处理对象的特定方式,所以我们这里不需要使用引用。因此这里使用引用是没有必要的。另外alter钩子没有返回值。

2. 参数类型被明确指定为了QueryAlterableInterface。虽然不是必须的,但是明确的指定参数类型,可以更好的避免在运行时传递过来错误的变量类型。还有类型被指定为了QueryAlterableInterface,而不是简单的使用SelectQuery,这是为了提供更好的向前兼容性。

    在alter钩子函数中,除了避免执行查询本身以外(因为这样会造成无限循环),我们可以对查询对象采取任何操作。 alter钩子可以根据查询上的标签和元数据来决定执行哪些动作。模块开发者,可以在查询对象上调用前面所列的各种附加方法,从而为查询添加额外的字段、关联、条件语句等等;也可以请求访问查询对象的内部数据结构,从而对它们进行直接操作。第一种方法主要用来向查询添加新的信息,而后一种方法允许alter钩子从查询中删除信息,或者操作已经排好队列的指令。

<?php
$fields =& $query->getFields();
$expressions =& $query->getExpressions();
$tables =& $query->getTables();
$order =& $query->getOrderBy();
$where =& $query->conditions();
$having =& $query->havingConditions();
?>

    这里特别提醒的一点是,在上面的代码中,所有返回的值都是引用形式(=&),这样就确保了alter钩子访问的数据结构和对象的完全一致。上面的所有方法,返回的都是一个数组,它们的结构,在includes/database/select.inc中,SelectQuery的内联文档中有具体介绍。


Drupal版本: