Wie kann ich den SQL-Speicherauszug von CakePHP im Controller sehen?


75

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:


125

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.


6
Ich musste dies kürzlich für eine ältere 1.2-Codebasis tun und die Methode ist ähnlich, aber nicht dieselbe : $log = $this->Model->getDataSource()->showLog( false ); debug( $log ). Nur für den Fall, dass jemand anderes diese Antwort über eine Suche findet.
Rob Wilkerson

9
Und Sie müssen festlegen Configure::write('debug', 2);, dass die MySQL-Protokollierung aktiviert wird.
Wirone

Für den Fall, dass jemand anderes eine kurze Referenz für die Aufgaben von getLog () benötigt: api.cakephp.org/2.3/class-DboSource.html#_getLog
Ben Wilson

37

Es gibt vier Möglichkeiten, Abfragen anzuzeigen:

  1. Dies zeigt die letzte vom Benutzermodell ausgeführte Abfrage:

    debug($this->User->lastQuery());  
    
  2. Dies zeigt alle ausgeführten Abfragen des Benutzermodells:

    $log = $this->User->getDataSource()->getLog(false, false);       
    debug($log);
    
  3. Dies zeigt ein Protokoll aller Abfragen:

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

29

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)

Quelle


9

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


5

Es ist sehr frustrierend, dass CakePHP kein $ this-> Model-> lastQuery (); hat. Hier sind zwei Lösungen, einschließlich einer modifizierten Version von Handsofaten:

1. Erstellen Sie eine letzte Abfragefunktion

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

2. Rendern Sie die SQL-Ansicht (im Modell nicht verfügbar).

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


5

In CakePHP 1.2 ..

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

2

Was schließlich für mich funktioniert hat und auch mit 2.0 kompatibel ist, ist das Hinzufügen in meinem Layout (oder im Modell)

<?php echo $this->element('sql_dump');?>

Dies hängt auch von der Debug-Variablen ab, die in Config / core.php festgelegt ist


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.