80 votes

Comment puis-je voir le dump SQL de CakePHP dans le contrôleur ?

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é.

126voto

deceze Points 200115

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.

40voto

urdesh kumar Points 255

Il existe quatre façons de présenter les requêtes :

  1. Ceci montrera la dernière requête exécutée du modèle de l'utilisateur :

    debug($this->User->lastQuery());  
  2. Cela montrera toutes les requêtes exécutées du modèle de l'utilisateur :

    $log = $this->Model->getDataSource()->getLog(false, false);       
    debug($log)
  3. Ceci montrera un journal de toutes les requêtes :

    $db =& ConnectionManager::getDataSource('default');
    $db->showLog();
  4. 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'); ?>

30voto

bjudson Points 2144

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 )

Source :

9voto

Govind Totla Points 602

Pour cakephp 2.0 Ecrivez 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 Écrire : echo $this->VotreNomDeModèle->getLastQuery() ;

5voto

Joe Purcell Points 126

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 ?)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X