Est-il possible que CakePHP dumpe son journal SQL à la demande? Je voudrais exécuter le code jusqu'à un point dans mon contrôleur et voir ce que SQL a été exécuté.
Essaye ç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 y a quatre façons d'afficher des requêtes:
Ceci montrera la dernière requête exécutée du modèle utilisateur:
debug($this->User->lastQuery());
Cela montrera toutes les requêtes exécutées du modèle utilisateur:
$log = $this->User->getDataSource()->getLog(false, false);
debug($log);
Cela affichera un journal de toutes les requêtes:
$db =& ConnectionManager::getDataSource('default');
$db->showLog();
Si vous souhaitez afficher le journal de toutes les requêtes dans l’application, vous pouvez l’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 produire le code SQL:
<?php echo $this->element('sql_dump'); ?>
Ainsi, vous pouvez créer une vue appelée "SQL", contenant uniquement la ligne ci-dessus, puis appeler cela dans votre contrôleur chaque fois que vous souhaitez la voir:
$this->render('sql');
(N'oubliez pas également de définir votre niveau de débogage sur au moins 2 dans app/config/core.php
)
pour cakephp 2.0 Écrivez cette fonction dans AppModel.php
function getLastQuery()
{
$dbo = $this->getDatasource();
$logs = $dbo->getLog();
$lastLog = end($logs['log']);
return $lastLog['query'];
}
Pour utiliser ceci dans le contrôleur .__, écrivez: echo $ this-> YourModelName-> getLastQuery ();
Il est grandement frustrant que CakePHP n'ait pas de $ this-> Model-> lastQuery () ;. Voici deux solutions, y compris une version modifiée de Handsofaten:
Pour imprimer la dernière requête exécutée, ajoutez dans votre fichier /app_model.php:
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 le résultat, vous pouvez exécuter:
debug($this->lastQuery()); // in model
OR
debug($this->Model->lastQuery()); // in controller
Pour imprimer toutes les requêtes exécutées dans une requête de page donnée, dans votre contrôleur (ou composant, etc.), exécutez:
$this->render('sql');
Il y aura probablement une erreur d'affichage manquante, mais c'est mieux que de ne pas avoir accès aux requêtes récentes!
(Comme Handsofaten l’a dit, il y a /elements/sql_dump.ctp dans cake/libs/view/elements /, mais j’ai pu le faire sans créer la vue sql.ctp. Quelqu'un peut-il expliquer cela?)
Dans CakePHP 1.2 ..
$db =& ConnectionManager::getDataSource('default');
$db->showLog();
Ce qui a finalement fonctionné pour moi et également compatible avec la version 2.0 est d’ajouter dans ma mise en page
<?php echo $this->element('sql_dump');?>
Cela dépend également de la variable de débogage configurée dans Config/core.php
Le plugin DebugKit pour le gâteau fera aussi l'affaire. https://github.com/cakephp/debug_kit