Existe-t-il un moyen d'amener CakePHP à vider son journal SQL à la demande ? J'aimerais exécuter du code jusqu'à un certain point dans mon contrôleur et voir quel SQL a été exécuté.
Réponses
Trop de publicités?Essayez ça :
$log = $this->Model->getDataSource()->getLog(false, false);
debug($log);
http://api.cakephp.org/2.3/class-Model.html#_getDataSource
Vous devrez le faire pour chaque source de données si vous en avez plusieurs.
Il existe quatre façons de présenter les requêtes :
-
Ceci montrera la dernière requête exécutée du modèle de l'utilisateur :
debug($this->User->lastQuery());
-
Cela montrera toutes les requêtes exécutées du modèle de l'utilisateur :
$log = $this->Model->getDataSource()->getLog(false, false); debug($log)
-
Ceci montrera un journal de toutes les requêtes :
$db =& ConnectionManager::getDataSource('default'); $db->showLog();
-
Si vous voulez montrer tous les journaux de requêtes dans toute l'application, vous pouvez utiliser dans view/element/filename.ctp.
<?php echo $this->element('sql_dump'); ?>
Si vous utilisez CakePHP 1.3, vous pouvez mettre ceci dans vos vues pour sortir le SQL :
<?php echo $this->element('sql_dump'); ?>
Vous pouvez donc créer une vue appelée "sql", contenant uniquement la ligne ci-dessus, puis l'appeler dans votre contrôleur lorsque vous voulez la voir :
$this->render('sql');
(N'oubliez pas non plus de régler le niveau de débogage sur au moins 2 dans le champ app/config/core.php
)
Il est très frustrant que CakePHP ne dispose pas d'un $this->Model->lastQuery() ;. Voici deux solutions dont une version modifiée de celle de Handsofaten :
1. Créer une fonction de dernière requête
Pour imprimer la dernière requête exécutée, dans votre fichier /app_model.php, ajoutez :
function lastQuery(){
$dbo = $this->getDatasource();
$logs = $dbo->_queriesLog;
// return the first element of the last array (i.e. the last query)
return current(end($logs));
}
Ensuite, pour imprimer la sortie, vous pouvez exécuter :
debug($this->lastQuery()); // in model
OU
debug($this->Model->lastQuery()); // in controller
2. Rendu de la vue SQL (non disponible dans le modèle)
Pour imprimer toutes les requêtes exécutées dans une demande de page donnée, dans l'exécution de votre contrôleur (ou composant, etc.) :
$this->render('sql');
Il y aura probablement une erreur de vue manquante, mais c'est mieux que de ne pas avoir accès aux requêtes récentes !
(Comme l'a dit Handsofaten, il y a le /elements/sql_dump.ctp dans cake/libs/view/elements/, mais j'ai pu faire ce qui précède sans créer la vue sql.ctp. Quelqu'un peut-il expliquer cela ?)