возникла проблема, мне нужно получить все идентификаторы моделей (не только видимые, но все модели) в 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 — это было бы здорово.
После некоторых исследований я создал пользовательский класс 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
Других решений пока нет …