2

遇到问题,我需要在 CGridView 中获取模型的所有 ID(不仅是可见的,而且是所有模型)。为此,我使用它的 DataProvider - 从中​​获取标准并将其传递给命令生成器

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

在我们通过相关表进行过滤之前,它工作正常。例如,用户将一个数字添加到网格的过滤器 - “House Number” = 24。当它发生时,相关表 - “address”添加到$criteria->with并且“address.home_number = 24”添加到$criteria->condition

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

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

4

1 回答 1

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

于 2016-05-14T14:12:57.503 回答