16

クエリを実行するたびにタイムアウト エラーが発生します。ジョイン付きのページネーションです。
SQLをデバッグしたいのですが、タイムアウトになってしまい見えません。

実行前にコンパイル済みの SQL クエリを確認するにはどうすればよいですか?


いくつかのケーキコード:

$this -> paginate = array(
        'limit' => '16',
        'joins' => array( array(
                'table' => 'products',
                'alias' => 'Product',
                'type' => 'LEFT',
                'conditions' => array('ProductModel.id = Product.product_model_id')
            )),
        'fields' => array(
            'COUNT(Product.product_model_id) as Counter',
            'ProductModel.name'
            ),
        'conditions' => array(
            'ProductModel.category_id' => $category_id,
        ),
        'group' => array('ProductModel.id')
    );
4

7 に答える 7

30

まず、 でdebug変数を 2 に設定しますapp/config/config.php

それから加えて:

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

レイアウトの最後に。これは実際には、デフォルトのケーキ レイアウトでコメント アウトする必要があります。

データベースに送信されるすべての SQL クエリを確認できるようになります。

次に、クエリをコピーし、データベースに対してSQL EXPLAINコマンド (リンクは MySQL 用) を使用して、DBMSでのクエリの動作を確認します。CakePHP のデバッグの詳細については、こちらを確認してください。

スクリプトはレンダリングさえしないため、次の方法でデータソースから直接最新のログを取得することができます。

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

getDatasource()関数はモデルで定義されているため、これはモデル内にある必要があります。$logs変数全体を調べて、そこにあるものを確認します。

于 2013-05-29T07:34:35.473 に答える
5

あなたができるもう1つのことは....

Cake/Model/DataSource/DboSource.php に移動し、関数 execute() を見つけて $sql 変数を出力します。それはSQLを出力するはずです。

これは確かに最もクリーンな方法ではありません(Cakeディレクトリを変更しているため)..しかし、SQLで何かが機能しない場合は、デバッグするだけで確実に最も速いでしょう.

于 2015-01-23T06:41:47.837 に答える
3
Try...
function getLastQuery($model) {
    $dbo = $model->getDatasource();
    $logData = $dbo->getLog();
    $getLog = end($logData['log']);
    echo $getLog['query'];
}
于 2014-05-22T12:06:30.647 に答える
2
class YourController extends AppController {
    function testfunc(){
        $this->Model->find('all', $options);
        echo 'SQL: '.$this->getLastQuery();
    }

    function getLastQuery()
    {
        $dbo = ConnectionManager::getDataSource('default');
        $logs = $dbo->getLog();
        $lastLog = end($logs['log']);
        return $lastLog['query'];
    }
}

または、lib/Cake/Model/DataSource.php の関数 execute() に次の行を追加して、すべてのクエリを取得できます。

Debugger::dump($sql);
于 2015-02-27T15:37:03.660 に答える