web-dev-qa-db-ja.com

Yii-findAllで使用されるSQLを出力する方法

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

14
Adrian Gunawan

実行したクエリをアプリケーションログに記録し、確認することができます。設定ファイルで次のようなもの:

_'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);
_
17
DCoder
  • 最初の方法(公式の方法):
    _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);
_
7

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

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

5
Ilya Malyutin

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);

私はイリヤの方法が信頼できないことを発見しました(理由はわかりませんが、この方法を使用すると基準が無視されることがあります)。

1
Arth

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

'log'=>array(
    'class'=>'CLogRouter',
    'routes'=>array(
        array(
            'class'=>'CWebLogRoute',
        ),
    ),
),
1
gSorry