2016-05-13 207 views
1

有问题,我需要在CGridView中获取所有模型的id(不仅可见,而且所有模型)。对于我使用其dataProvider - 从它那里得到一个标准,并把它传递给命令生成器Yii 1,获取由CDbCriteria生成的SQL

$criteria = $dataProvider->getCriteria(); 
$criteria->select = 'id'; 
$command = Y::db()->commandBuilder->createFindCommand('tableName', $criteria); 
$ids = $command->queryColumn(); 

这是工作的罚款,直到我们得到了通过相关表过滤。例如,用户向网格的过滤器添加数字 - “House Number”= 24.当发生相关表 - “地址”增加到$criteria->with和“address.home_number = 24”增加到$criteria->condition

ActiveRecord会自动分析条件的“with”属性并应用连接,所以我们的条件会很好,但是CommandBuilder不是。我无法使用AR,因为它速度很慢。我必须使用Builder,但我无法连接,可能会应用超过20个过滤器。

如果我可以得到由AR生成的SQL,然后将它传递给Builder - 那将会很棒。

回答

0

经过一番研究,我创建了自定义类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; 

在这里你可以抢班 - https://github.com/LinGG/ActiveFinder

+0

即使这个定制ActiveFinder不是也许做的最好的方法这,它的作品。从我的角度来看,如果ActiveFinder扩展CActiveFinder并添加这个静态getCommand并覆盖应该更改的其他函数将会更好... – zmilan

+0

我刚在短时间内为我的需要创建了它。如果你想让它变得更好,欢迎您:) –

+0

我明白,做这项工作足够好。我只是提到它,因为你出于某种原因有-1。我想说,即使这不是一个很好的例子,但它仍然能够完成这项工作。 – zmilan