web-dev-qa-db-ja.com

cakephpは、実行前にコンパイル済みSQLクエリを確認します

クエリを実行するたびにタイムアウトエラーが発生します。結合によるページ付け。
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')
    );
16
yossi

まず、_app/config/config.php_でdebug変数を2に設定します。

それから加えて:

_<?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_変数全体を調べて、そこに何があるかを確認します。

30
Borislav Sabev

もう1つできることは...です。

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

これは確かに最もきれいな方法ではありません(Cakeディレクトリを変更しているため)。

5
Ninad Desai
Try...
function getLastQuery($model) {
    $dbo = $model->getDatasource();
    $logData = $dbo->getLog();
    $getLog = end($logData['log']);
    echo $getLog['query'];
}
3
Indrajeet Singh

特定のモデルの実行されたすべてのクエリを表示する簡単な方法:

  $sqllog = $this->ModelName->getDataSource()->getLog(false, false);       
  debug($sqllog);
3
Faisal
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);
2
Sadee

app/config/config.phpでデバッグ変数を2に設定します。

echo $this->Payment->save();

=> SQLクエリのように出力:INSERT INTO photoora_photoorange.payments VALUES(*******)

[クエリを挿入] [2]

0
palkesh