2016-05-13 10 views
1

問題が発生したので、CGidViewでモデルのすべてのID(可視ではなくすべてのモデル)を取得する必要があります。そのために私はそのデータプロバイダを使用して - 私たちは、関連テーブルを経由してフィルタリングしてしまったまでそれが正常に動作していることから、基準を取得し、ビルダーYii 1、CDbCriteriaで生成されたSQLを取得

$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以上のフィルタが適用される可能性があります。

私は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

関連する問題