スポンサードリンク

CakePHP
CakePHP

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を見る方法

スポンサードリンク