当我们用CDbCacheDependency定义缓存依赖时,我们必须提供一个SQL作为依赖。当我们使用CDbCriteria时,不可能提供sql,因为sql是通过带有适当参数token的criteria构建的。
是否有任何方法我们可以使用CDbCriteria作为缓存依赖?这样问对吗?因为我只对CDbCriteria构建的sql感兴趣,其他我必须手动构建sql,我认为这是不对的。
谢谢
从Yii 1.1.13开始,恐怕您将必须使用SQL语句,并且没有直接使用CDbCriteria
的方法。
然而有一个间接的方法使用CDbCriteria
,但最终你将不得不使用它来生成一个SQL命令,你将把它作为你的依赖传递。该技术使用CDbCommandBuilder
及其方法。
示例(参见注释以理解):
$criteria=new CDbCriteria;
// ... replace with code to set up your criteria ...
// ...
// first create commandBuilder instance
$commandBuilder = new CDbCommandBuilder(Yii::app()->db->schema);
// then create command using criteria
$command = $commandBuilder->createFindCommand('table_name', $criteria);
// then get sql statement text
$sql = $command->text;
// then set your dependency
$dependency = new CDbCacheDependency($sql);
// if you have params in the criteria, set the params for dependency
$dependency->params = $criteria->params;
// now your dependency is usable
在上面我使用了createFindCommand
,还有其他的方法,如CDbCommandBuilder
中的createCountCommand
,使用一个生成你必须运行的sql语句。
或者你可以使用查询生成器,但当然那里不会有任何CDbCriteria
。