作者:老葛,北京亚艾元软件有限责任公司,http://www.yaiyuan.com
为了使用一个扩展器,你首先需要有一个查询对象。extend()方法由查询对象返回一个新的对象,来替换原有的查询对象。例如:
<?php
$query = $query->extend('PagerDefault');
?>
上面的代码中,查询对象调用extend()方法,创建了一个新的PagerDefault查询对象,新对象包含了原来的选择查询,最后返回这个新创建的对象。现在,$query除了具有原来查询对象的各种功能以外,现在又有了新的附加方法可用。
注意,$query的变更不是当即生效的。从extend()中返回了一个新的对象,我们需要把这个对象存放在一个变量中,否则它就会丢失。例如,下面的代码就不会按照你的期望执行:
<?php
$query = db_select('node', 'n');
$query
->fields('n', array('nid', 'title')
->extend('PagerDefault') //这一行返回一个新的PagerDefault对象
->limit(5); //这一行能够工作,因为正被调用的是PagerDefault对象。
//从extend()中返回的对象没有被保存,所以$query仍然是最初的选择对象。
$query->orderBy('title');
//这一行执行的是最初的选择对象,而不是扩展。扩展现在已不存在。
$result = $query->execute();
?>
为了避免这一问题,推荐大家在初次定义查询时,就对选择查询进行扩展。
<?php
$query = db_select('node', 'n')->extend('PagerDefault')->extend('TableSort');
$query->fields(...);
// ...
?>
这就确保了,从一开始,$query就是完全扩展后的对象。
还有需要注意的是,尽管扩展器可被堆叠调用(如上例所示),但是并不是所有的扩展器都相互兼容,并且扩展的先后顺序也有可能会对结果产生影响。例如,同时扩展了分页和表排序行为的查询,必须要先扩展PagerDefault。