web-dev-qa-db-ja.com

コントローラでCakePHPのSQLダンプを表示するにはどうすればよいですか?

CakePHPにSQLログをオンデマンドでダンプさせる方法はありますか?コントローラーのポイントまでコードを実行し、実行されたSQLを確認したいと思います。

73
Justin

これを試して:

$log = $this->Model->getDataSource()->getLog(false, false);
debug($log);

http://api.cakephp.org/2.3/class-Model.html#_getDataSource

ただし、複数のデータソースがある場合は、データソースごとにこれを行う必要があります。

123
deceze

クエリを表示するには4つの方法があります。

  1. これにより、ユーザーモデルに対して実行された最後のクエリが表示されます。

    debug($this->User->lastQuery());  
    
  2. これにより、ユーザーモデルの実行されたすべてのクエリが表示されます。

    $log = $this->User->getDataSource()->getLog(false, false);       
    debug($log);
    
  3. これにより、すべてのクエリのログが表示されます。

    $db =& ConnectionManager::getDataSource('default');
    $db->showLog();
    
  4. すべてのクエリログをアプリケーション全体に表示する場合は、view/element/filename.ctpで使用できます。

    <?php echo $this->element('sql_dump'); ?>
    
35
urdesh kumar

CakePHP 1.3を使用している場合、これをビューに追加してSQLを出力できます。

<?php echo $this->element('sql_dump'); ?>

したがって、上記の行のみを含む「sql」というビューを作成し、表示したいときにコントローラーでこれを呼び出すことができます。

$this->render('sql');

app/config/core.phpでデバッグレベルを少なくとも2に設定することも忘れないでください)

ソース

29
bjudson

cakephp 2.0の場合AppModel.phpでこの関数を記述します

function getLastQuery()
{
    $dbo = $this->getDatasource();
    $logs = $dbo->getLog();
    $lastLog = end($logs['log']);
    return $lastLog['query'];
}

Controller Writeでこれを使用するには、echo $ this-> YourModelName-> getLastQuery();

7
Govind Totla

CakePHPに$ this-> Model-> lastQuery();がないのはとてもイライラします。 Handsofatenの修正バージョンを含む2つのソリューションを次に示します。

1.最後のクエリ関数を作成する

最後のクエリ実行を印刷するには、/ app_model.phpファイルに次を追加します。

function lastQuery(){
    $dbo = $this->getDatasource();
    $logs = $dbo->_queriesLog;
    // return the first element of the last array (i.e. the last query)
    return current(end($logs));
}

次に、出力を印刷するには、次を実行できます。

debug($this->lastQuery()); // in model

OR

debug($this->Model->lastQuery()); // in controller

2. SQLビューをレンダリングします(モデル内では使用できません)

特定のページリクエストで実行されるすべてのクエリを印刷するには、コントローラー(またはコンポーネントなど)で次を実行します。

$this->render('sql');

ビューが見つからないというエラーがスローされる可能性がありますが、最近のクエリにアクセスできないよりはましです。

(Handsofatenが言ったように、cake/libs/view/elements /に/elements/sql_dump.ctpがありますが、sql.ctpビューを作成せずに上記を行うことができました。誰もそれを説明できますか?)

5
Joe Purcell

CakePHP 1.2では..

$db =& ConnectionManager::getDataSource('default');
$db->showLog();
4
rtconner

最終的に私にとってうまくいき、2.0とも互換性があるのは、レイアウト(またはモデル)を追加することです

<?php echo $this->element('sql_dump');?>

また、Config/core.phpに設定されたデバッグ変数にも依存します

2
Pipo

CakeのプラグインDebugKitも同様に機能します。 https://github.com/cakephp/debug_kit

0
Rito