Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/253.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Yii 1,获取CDbCriteria生成的SQL_Php_Mysql_Yii_Cactivedataprovider - Fatal编程技术网

Php Yii 1,获取CDbCriteria生成的SQL

Php Yii 1,获取CDbCriteria生成的SQL,php,mysql,yii,cactivedataprovider,Php,Mysql,Yii,Cactivedataprovider,遇到问题,我需要在CGridView中获取所有模型的ID(不仅可见,而且所有模型)。为此,我使用它的数据提供程序-从中获取一个条件并将其传递给command builder $criteria = $dataProvider->getCriteria(); $criteria->select = 'id'; $command = Y::db()->commandBuilder->createFindCommand('tableName', $criteria); $ids

遇到问题,我需要在CGridView中获取所有模型的ID(不仅可见,而且所有模型)。为此,我使用它的数据提供程序-从中获取一个条件并将其传递给command builder

$criteria = $dataProvider->getCriteria();
$criteria->select = 'id';
$command = Y::db()->commandBuilder->createFindCommand('tableName', $criteria);
$ids = $command->queryColumn();
在我们通过相关表进行过滤之前,它工作正常。例如,用户向网格的过滤器中添加一个数字——“房屋编号”=24。当发生这种情况时,相关表格-“地址”添加到
$criteria->with
,“address.home\u number=24”添加到
$criteria->condition

ActiveRecord自动解析criteria和apply联接的“with”属性,因此我们的条件可以使用它,但CommandBuilder-不行。我不能用AR,因为它非常慢。我必须使用生成器,但我不能进行联接,可能应用了20多个筛选器


如果我能得到AR生成的SQL,然后将其传递给构建器,那就太好了。

经过一些研究,我已经创建了自定义类ActiveFinder——Yii框架的CActiveFinder类的副本。因此,您只需在新的静态方法中传递要搜索的模型和条件:

$model = new User();
$criteria = new CDbCriteria();
$criteria->select = 't.id';
$command = ActiveFinder::getCommand($model, $criteria);
// $command variable have the SQL text
$sql = $command->text;
在这里,你可以抓到这门课-

即使是这种定制的ActiveFinder也可能不是最好的方法,它很有效。从我的观点来看,如果ActiveFinder扩展了CActiveFinder并添加这个静态getCommand并覆盖其他应该更改的函数,那就更好了……我只是在很短的时间内根据自己的需要创建了它。如果你想做得更好,欢迎你:)我理解这一点,做好这项工作就足够了。我提到它是因为出于某种原因你有-1。我想说的是,即使这不是一个很好的例子,但它仍然能完成任务。是的,看起来是这样的。它很容易尝试,而且很有效:)