Gibt es eine Möglichkeit, CakePHP dazu zu bringen, sein SQL-Protokoll bei Bedarf zu sichern? Ich möchte Code bis zu einem bestimmten Punkt in meinem Controller ausführen und sehen, welche SQL ausgeführt wurde.
Antworten:
Versuche dies:
$log = $this->Model->getDataSource()->getLog(false, false);
debug($log);
http://api.cakephp.org/2.3/class-Model.html#_getDataSource
Sie müssen dies für jede Datenquelle tun, wenn Sie jedoch mehr als eine haben.
Configure::write('debug', 2);
, dass die MySQL-Protokollierung aktiviert wird.
Es gibt vier Möglichkeiten, Abfragen anzuzeigen:
Dies zeigt die letzte vom Benutzermodell ausgeführte Abfrage:
debug($this->User->lastQuery());
Dies zeigt alle ausgeführten Abfragen des Benutzermodells:
$log = $this->User->getDataSource()->getLog(false, false);
debug($log);
Dies zeigt ein Protokoll aller Abfragen:
$db =& ConnectionManager::getDataSource('default');
$db->showLog();
Wenn Sie alle Abfrageprotokolle in der gesamten Anwendung anzeigen möchten, können Sie sie in view / element / filename.ctp verwenden.
<?php echo $this->element('sql_dump'); ?>
Wenn Sie CakePHP 1.3 verwenden, können Sie dies in Ihre Ansichten einfügen, um SQL auszugeben:
<?php echo $this->element('sql_dump'); ?>
Sie können also eine Ansicht mit dem Namen "sql" erstellen, die nur die obige Zeile enthält, und diese dann in Ihrem Controller aufrufen, wann immer Sie sie sehen möchten:
$this->render('sql');
(Denken Sie auch daran, Ihre Debug-Stufe auf mindestens 2 Zoll einzustellen. app/config/core.php
)
für cakephp 2.0 Schreiben Sie diese Funktion in AppModel.php
function getLastQuery()
{
$dbo = $this->getDatasource();
$logs = $dbo->getLog();
$lastLog = end($logs['log']);
return $lastLog['query'];
}
So verwenden Sie dies in Controller Write: echo $ this-> YourModelName-> getLastQuery ();
Es ist sehr frustrierend, dass CakePHP kein $ this-> Model-> lastQuery (); hat. Hier sind zwei Lösungen, einschließlich einer modifizierten Version von Handsofaten:
Um den letzten Abfragelauf zu drucken, fügen Sie in Ihrer Datei /app_model.php Folgendes hinzu:
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));
}
Um die Ausgabe zu drucken, können Sie Folgendes ausführen:
debug($this->lastQuery()); // in model
ODER
debug($this->Model->lastQuery()); // in controller
So drucken Sie alle Abfragen aus, die in einer bestimmten Seitenanforderung in Ihrem Controller (oder Ihrer Komponente usw.) ausgeführt werden:
$this->render('sql');
Es wird wahrscheinlich einen fehlenden Ansichtsfehler auslösen, aber dies ist besser als kein Zugriff auf aktuelle Abfragen!
(Wie Handsofaten sagte, gibt es die Datei /elements/sql_dump.ctp in cake / libs / view / elements /, aber ich konnte das oben genannte tun, ohne die Ansicht sql.ctp zu erstellen. Kann das jemand erklären?)
Das Plugin DebugKit für Kuchen erledigt ebenfalls die Aufgabe. https://github.com/cakephp/debug_kit
$log = $this->Model->getDataSource()->showLog( false ); debug( $log )
. Nur für den Fall, dass jemand anderes diese Antwort über eine Suche findet.