クエリを実行するたびにタイムアウトエラーが発生します。結合によるページ付け。
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')
);
まず、_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
_変数全体を調べて、そこに何があるかを確認します。
もう1つできることは...です。
Cake/Model/DataSource/DboSource.phpに移動し、関数execute()を見つけて$ sql変数を出力します。これでSQLが出力されます。
これは確かに最もきれいな方法ではありません(Cakeディレクトリを変更しているため)。
Try...
function getLastQuery($model) {
$dbo = $model->getDatasource();
$logData = $dbo->getLog();
$getLog = end($logData['log']);
echo $getLog['query'];
}
特定のモデルの実行されたすべてのクエリを表示する簡単な方法:
$sqllog = $this->ModelName->getDataSource()->getLog(false, false);
debug($sqllog);
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);
app/config/config.phpでデバッグ変数を2に設定します。
echo $this->Payment->save();
=> SQLクエリのように出力:INSERT INTO photoora_photoorange
.payments
VALUES(*******)
[クエリを挿入] [2]