15

データベースからいくつかのレコードを取得する次のコードがあります

    $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 を使用してバックグラウンドでスクリプトを実行しています。

4

5 に答える 5

18

実行されたクエリをアプリケーション ログに記録して確認できます。設定ファイルには次のようなものがあります。

'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);
于 2012-05-17T04:40:49.597 に答える
8

次のように、CDbCommandBuilder を使用して SQL を取得できます。

ModelClassName::model()-> getCommandBuilder()-> createFindCommand('tableName', $criteria)->text;

于 2014-08-13T05:43:38.740 に答える
1

あなたのページで直接ログを見ることができます:

'log'=>array(
    'class'=>'CLogRouter',
    'routes'=>array(
        array(
            'class'=>'CWebLogRoute',
        ),
    ),
),
于 2013-03-07T14:42:33.353 に答える