Ma requête obtient l'erreur de délai d'attente à chaque exécution. C'est une pagination avec des jointures.
Je veux déboguer le SQL, mais depuis que j'ai un délai d'attente, je ne le vois pas.
Comment puis-je voir la requête SQL compilée avant exécution?
Un code de gâteau:
$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')
);
Tout d’abord, définissez la variable debug
sur 2 dans app/config/config.php
.
Puis ajouter:
<?php echo $this->element('sql_dump');?>
à la fin de votre mise en page. Cela devrait en fait être commenté dans votre mise en page de gâteau par défaut.
Vous pourrez maintenant voir toutes les requêtes SQL qui vont à la base de données.
Maintenant, copiez la requête et utilisez la commande SQL EXPLAIN (le lien concerne MySQL) sur la base de données pour voir ce que la requête fait dans DBMS . Pour plus d'informations sur le débogage de CakePHP, consultez ici .
Comme votre script ne rend même pas, vous pouvez essayer d'obtenir le dernier journal directement à partir de la source de données avec:
function getLastQuery()
{
$dbo = $this->getDatasource();
$logs = $dbo->getLog();
$lastLog = end($logs['log']);
return $lastLog['query'];
}
Cela doit être dans un modèle car la fonction getDatasource()
est définie dans un modèle. Inspectez la variable $logs
entière et voyez ce qu’elle contient.
Une dernière chose à faire est de…
Allez dans Cake/Model/DataSource/DboSource.php et localisez la fonction execute () et imprimez la variable $ sql. Cela devrait imprimer le SQL.
Ce n'est certainement pas le moyen le plus propre (car vous changez de répertoire Cake) .. mais il serait certainement plus rapide de déboguer si quelque chose ne fonctionne pas avec SQL.
Try...
function getLastQuery($model) {
$dbo = $model->getDatasource();
$logData = $dbo->getLog();
$getLog = end($logData['log']);
echo $getLog['query'];
}
Un moyen simple d'afficher toutes les requêtes exécutées de votre modèle donné:
$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'];
}
}
ou vous pouvez obtenir toute la requête en ajoutant la ligne suivante à la fonction execute () dans lib/Cake/Model/DataSource.php
Debugger::dump($sql);
définissez la variable de débogage sur 2 dans app/config/config.php.
echo $this->Payment->save();
Sort mis comme => requête SQL: INSERT INTO photoora_photoorange
.payments
VALUES (*******)
[insérer la requête] [2]