Dbからいくつかのレコードを取得する次のコードがあります
$criteria = new CDbCriteria();
$criteria->condition = 't.date BETWEEN "'.$from_date.'" AND "'.$to_date.'"';
$criteria->with = array('order');
$orders = ProductOrder::model()->findAll($criteria);
FindAllによって使用されるSQLを取得することは可能ですか?デバッグコンソールから取得できることはわかっています。しかし、私はyiic.phpを使用してバックグラウンドでスクリプトを実行しています
実行したクエリをアプリケーションログに記録し、確認することができます。設定ファイルで次のようなもの:
_'components' => array(
'db'=>array(
'enableParamLogging' => true,
),
'log'=>array(
'class'=>'CLogRouter',
'routes'=>array(
array(
'class'=>'CFileLogRoute',
'levels'=>'trace,log',
'categories' => 'system.db.CDbCommand',
'logFile' => 'db.log',
),
),
),
);
_
場合によっては(テストを実行する場合など)、これが機能するために、プロセスの最後にYii::app()->log->processLogs(null);
を呼び出す必要もあります。
もちろん、一度ログに記録されたメッセージに対して何か別のことをする独自のログルートを書くのを妨げるものは何もありませんが、ログはリクエストの最後に(またはprocessLogs
を呼び出すときに)処理されることに注意してください。 )、何かをログに記録するたびではありません。
ちなみに、動的入力をクエリ内で直接行うようなクエリは作成しないでください。代わりにバインド変数を使用してください:
_$criteria = new CDbCriteria();
$criteria->condition = 't.date BETWEEN :from_date AND :to_date';
$criteria->params = array(
':from_date' => $from_date,
':to_date' => $to_date,
);
$criteria->with = array('order');
$orders = ProductOrder::model()->findAll($criteria);
_
最初の方法(公式の方法):
_main.php
_構成ファイルで、これらの2つのパラメーターを_log section
_に追加すると、ページの最後にログメッセージが表示されるか、ブラウザーに_FireBug Console
_が表示されます。 db
セクションで必要なパラメータを設定することを忘れないでください。
'components' => array( 'db'=>array( 'enableProfiling'=>true, 'enableParamLogging' => true, ), 'log'=>array( 'class'=>'CLogRouter', 'routes'=>array( array( 'class'=>'CWebLogRoute', 'showInFireBug' => true, ), array( 'class'=>'CProfileLogRoute', 'levels'=>'profile', 'enabled'=>true, ), ), ), );
2番目の方法:
コードで列のスペルを誤ったものに変更すると、エラーページに完全なSQLクエリを含むエラーメッセージが表示されます(_YII_DEBUG
_モードがtrueである必要があります)。このようなもの:
(_t.date
_を_t.wrong_date
_に変更しました。ページを更新すると、データベースで実行された生成されたSQLが表示されます)
$criteria = new CDbCriteria(); $criteria->condition = 't.wrong_date BETWEEN "'.$from_date.'" AND "'.$to_date.'"'; $criteria->with = array('order'); $orders = ProductOrder::model()->findAll($criteria);
両方の方法で、_YII_DEBUG
_で_index.php
_をtrueにする
_defined('YII_DEBUG') or define('YII_DEBUG',true);
_
次のように、CDbCommandBuilderを使用してSQLを取得できます。
ModelClassName::model()-> getCommandBuilder()-> createFindCommand('tableName', $criteria)->text;
SQLを表示する前にクエリを実行したくない場合、これは実際には期待するほど簡単ではありません。
それは間違っているのと同じくらい汚いですが、開発のみの場合は、過去に意図的に意図的なエラーを基準に追加し、結果の例外を使用してSQLを試行することにしました。
例えば.
$criteria = new CDbCriteria();
$criteria->condition = 't.date_fgjhfgjfgj BETWEEN :from_date AND :to_date';
$criteria->params = array(
':from_date' => $from_date,
':to_date' => $to_date,
);
$criteria->with = array('order');
$orders = ProductOrder::model()->findAll($criteria);
私はイリヤの方法が信頼できないことを発見しました(理由はわかりませんが、この方法を使用すると基準が無視されることがあります)。
あなたのページで直接ログを見ることができます:
'log'=>array(
'class'=>'CLogRouter',
'routes'=>array(
array(
'class'=>'CWebLogRoute',
),
),
),