
CakePHPのブログチュートリアルの削除(deleteアクション)のように
コントローラー内で作業をさせて
終わったらリダイレクトして
そのアクションのビューを使わないということがあります。
この動きだと、DebugモードのSQL文が表示されないため
動きがおかしかった時に確認がし辛かったので
一時的にリダイレクト先でもSQL文が見れるようにしました。
リダイレクト先でもSQL文を見る方法
1.アクション内のSQL文を取得する
2.SQL文をセッションで保存
3.リダイレクト先でセッションの中身を表示
こんな感じです。
1.ページ内のSQL文を取得する
アクション内で使っているSQL文が
どういうものかを調べます。
コントローラー内で以下を実行します。
debug($this->Model->getDataSource()->getLog());
これで実行しているSQL文が以下のような連想配列でビューに表示されます。
array(
'log' => array(
(int) 0 => array(
'query' => 実行したSQL文,
'params' => array(),
'affected' => (int) 20,
'numRows' => (int) 20,
'took' => (float) 1
),
(int) 1 => array(
'query' => 実行したSQL文,
'params' => array(),
'affected' => (int) 20,
'numRows' => (int) 20,
'took' => (float) 1
),
・・・
2.SQL文をセッションで保存
次に先ほど表示させたSQL文をセッションに保存します。
※ビューを使わずにリダイレクトさせるアクション内
//リダイレクトの前に記述
if($this->Session->check('sql')){
$this->Session->delete('sql');
}
$this->Session->write('sql',$this->Model->getDataSource()->getLog());
$this->redirect(array('action' => 'index'));
sqlという名前でセッションに保存させます。
保存する前に古いsqlがあるかをチェックしてます。
3.リダイレクト先でセッションの中身を表示
次にリダイレクト先でセッションを取得して表示します。
上記の例だとindexアクションに書きます。
※リダイレクト先のアクション
if($this->Session->check('sql')){
$sql = $this->Session->read('sql');
$this->set('sql', $sql);
}
ビューにSQL文を表示させたい場所に以下を書きます。
※リダイレクト先のビュー
<?php
if(!empty($sql)){
foreach($sql['log'] as $s){
echo $s['query'] . "<br>";
}
}
?>
こうすると、リダイレクト前のSQL文が表示されて
チェックができます。
(参考)
CakePHPのView以外で実行されたSQLを見る方法
