web-dev-qa-db-fra.com

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

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

71
Justin

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.

120
deceze

Il y a quatre façons d'afficher des requêtes:

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

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

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

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

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)

La source

29
bjudson

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 ();

7
Govind Totla

Il est grandement frustrant que CakePHP n'ait pas de $ this-> Model-> lastQuery () ;. Voici deux solutions, y compris une version modifiée de Handsofaten:

1. Créer une dernière fonction de requête

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

2. Rendre la vue SQL (non disponible dans le modèle)

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

5
Joe Purcell

Dans CakePHP 1.2 ..

$db =& ConnectionManager::getDataSource('default');
$db->showLog();
4
rtconner

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 

2
Pipo

Le plugin DebugKit pour le gâteau fera aussi l'affaire. https://github.com/cakephp/debug_kit

0
Rito