Yii 1, получить SQL, сгенерированный CDbCriteria

возникла проблема, мне нужно получить все идентификаторы моделей (не только видимые, но все модели) в CGridView. Для этого я использую его DataProvider — получаю из него критерии и передаю его сборщику команд

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

Это работает нормально, пока мы не получили фильтрацию по связанным таблицам. Например, пользователь добавляет число к фильтру сетки — «Номер дома» = 24. Когда это происходит, связанные таблицы — «адрес» добавляет к $criteria->with и «address.home_number = 24» добавляет к $criteria->condition,

ActiveRecord автоматически анализирует свойство «with» критериев и применяет объединения, поэтому наше условие будет в порядке, но CommandBuilder — нет. Я не могу использовать AR для этого, так как это смертельно медленно. Я должен использовать Builder, но я не могу делать объединения, может быть применено более 20 фильтров.

Если бы я мог получить SQL, сгенерированный AR, а затем передать его Builder — это было бы здорово.

2

Решение

После некоторых исследований я создал пользовательский класс ActiveFinder — копию класса CActiveFinder фреймворка Yii. Таким образом, вы можете просто передать модель, которую вы собираетесь искать, и критерии в новом статическом методе:

$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

Другие решения

Других решений пока нет …