LoginSignup
5
8

More than 5 years have passed since last update.

cakephpで実行したSQLを確認する方法

Last updated at Posted at 2017-05-09

結構書いた人多いと思うが、私は使った時なぜかどうしてもログが出てこなかったので、ここで詰まってる人もいるのかなぁーと思って
まずは、自分のコントローラーにこういうメソッドを追加しましょう

ArticlesController.php
private function getLastQuery() { //privateはあるかどうか構わないがprivateの方をおすすめ
        $dbo = $this->Article->getDatasource(); //モデル名はArticleとする時
        $logData = $dbo->getLog();
        $getLog = end($logData['log']);
        $this->log($getLog['query'],LOG_DEBUG);
}

//使うとき
function test(){
        $this->Article->find('all');
        $this->getLastQuery(); //とりあえず見たいヘルパーの後ろに追加
}

けど偶にこんなように空のログが出る時もある

debug.log
2017-05-09 16:57:10 Debug: Array
(
    [log] => Array
        (
        )

    [count] => 0
    [time] => 
)

SQLを確認する行為は、debuggerのクラスは2以上じゃないといけない
なのでcakephp/app/Config/core.phpをいじらないといけない

cakephp/app/Config/core.php
Configure::write('debug', 2);

さらに共通のコンポーネントを作りました、よかったら使って見ましょう

QueryComponent.php
<?php
App::uses('AppComponent', 'Controller/Component');
class QueryComponent extends AppComponent {

    public function getAllQuery($modelName) { 
        $model = ClassRegistry::init($modelName);
        $dbo = $model->getDatasource(); 
        $logData = $dbo->getLog();
        foreach ($logData['log'] as $key => $data) {
            $querys[$key]['query'] = $data['query'];
        }
        $this->log('Get ALL query of Model:'.$modelName,LOG_DEBUG);
        $this->log($querys,LOG_DEBUG);
    }

    public function getLastQuery($modelName) { 
        $model = ClassRegistry::init($modelName);
        $dbo = $model->getDatasource(); 
        $logData = $dbo->getLog();
        $getLog = end($logData['log']);
        $this->log('Get last query of Model:'.$modelName,LOG_DEBUG);
        $this->log($getLog['query'],LOG_DEBUG);
    }
}
5
8
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
8