2012-03-27 6 views
0

CDbCriteriaからクエリの文字列表現を取得する方法はありますか?テストとデバッグのため。CDbCriteriaからの文字列表現の取得

+0

'CDbCriteria'は、完全なクエリを構築するのに十分な情報を集約しません。モデルクラスには相当量の関連情報が含まれているため、両方を含める必要があります。 – Jon

答えて

4

あなたはこのようなあなたのmain.phpを設定ロギングとプロファイリングを使用することができます。

'components'=>array(
    'log'=>array(
     'class'=>'CLogRouter', 
     'routes'=>array(
      array(
       'class'=>'CWebLogRoute', 
       'categories'=>'system.db.CDbCommand', 
       'showInFireBug'=>true, 
      ), 
     ), 
    ), 
    'db'=>array(
     'enableProfiling'=>true, 
     'enableParamLogging'=>true, 
    ),    
), 
+0

私がenableProfiling、enableParamLogging、showInFireBug(行方不明だった私の設定の唯一のもの)で行を追加した場合、どうすればSQLを取得できますか?私はFireBugの設定がFireBugのSQLショーを正しいものにすると期待していますか? –

+0

はい、私が覚えている限りです。 – Puigcerber

+0

Puigcerber、私はWindows 7マシンでローカルインスタンスにログオンすることができません。コンソールのタブで、火かき棒のどこにこれを表示する必要がありますか?それがなければどこを見なければならないのですか? SQLを見るには、何かを見るためにLog.Debug($ criteria)のようなことをする必要がありますか? –

1

私はあなたたちとそれを共有すると考え、この質問への答えを見つけるために多くの時間量を費やしています。これがあなたの貴重な時間を節約することを願っています。

上記のJonが述べたように、CDbCriteriaは、完全なクエリを構築するのに十分な情報を集計していないため、クエリ制約を設定するモデルクラス情報も使用する必要があります。

CDbCriteriaのYiiドキュメントに示されている例のように、これは、あなたがIT-を使用する方法を基本的に

ここ
$criteria=new CDbCriteria(); 
$criteria->compare('status',Post::STATUS_ACTIVE); 
$criteria->addInCondition('id',array(1,2,3,4,5,6)); 

$posts = Post::model()->findAll($criteria); 

Postは、クエリの条件を実行した上でモデルの名前です。

したがって、CDbCriteriaで書かれたクエリのテキスト表現を取得するには、モデル情報も含める必要があります。

これは、あなたがそれを行うことができる方法です - あなたは$query変数に値を印刷するとき

$model = new Post(); 
$query = $model->getCommandBuilder()->createFindCommand($model->getTableSchema(), $criteria)->getText(); 

それは生のクエリを出力します。

これが役に立ちます。

+0

偉大な答えとロギングの設定を変更するよりも良い。最終クエリの唯一の問題は、「:productId」などのプレースホルダがまだ含まれていることです。 – niekoost

関連する問題