it-swarm.com.de

cakephp zeigt die kompilierte SQL-Abfrage vor der Ausführung an

Meine Abfrage erhält bei jedem Lauf den Timeout-Fehler. Es ist eine Paginierung mit Joins.
Ich möchte das SQL debuggen, aber da ich einen Timeout bekomme, kann ich es nicht sehen.

Wie kann ich die kompilierte SQL-Abfrage vor der Ausführung sehen?


Einige Kuchencodes:

$this -> paginate = array(
        'limit' => '16',
        'joins' => array( array(
                'table' => 'products',
                'alias' => 'Product',
                'type' => 'LEFT',
                'conditions' => array('ProductModel.id = Product.product_model_id')
            )),
        'fields' => array(
            'COUNT(Product.product_model_id) as Counter',
            'ProductModel.name'
            ),
        'conditions' => array(
            'ProductModel.category_id' => $category_id,
        ),
        'group' => array('ProductModel.id')
    );
13
yossi

Setzen Sie zunächst die Variable debug in app/config/config.php auf 2.

Dann füge hinzu:

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

am Ende deines Layouts. Dies sollte eigentlich in Ihrem Standard-Kuchenlayout auskommentiert werden. 

Sie können jetzt alle SQL-Abfragen sehen, die an die Datenbank gesendet werden.

Kopieren Sie nun die Abfrage und verwenden Sie den Befehl SQL EXPLAIN (Verknüpfung für MySQL) über der Datenbank, um zu sehen, was die Abfrage in DBMS macht. Weitere Informationen zum Debugging von CakePHP finden Sie unter hier .

Da Ihr Skript nicht einmal gerendert wird, können Sie versuchen, das neueste Protokoll direkt aus der Datenquelle abzurufen:

function getLastQuery()
{
    $dbo = $this->getDatasource();
    $logs = $dbo->getLog();
    $lastLog = end($logs['log']);
    return $lastLog['query'];
}

Dies muss sich in einem Modell befinden, da die Funktion getDatasource() in einem Modell definiert ist. Überprüfen Sie die gesamte $logs-Variable und sehen Sie, was dort enthalten ist.

27
Borislav Sabev

Eine weitere Sache, die Sie tun können, ist .... 

Gehen Sie zu Cake/Model/DataSource/DboSource.php und suchen Sie die Funktion execute () und drucken Sie die Variable $ sql. Das sollte die SQL drucken.

Dies ist sicherlich nicht der sauberste Weg (da Sie das Cake-Verzeichnis ändern) .., wäre aber sicherlich am schnellsten zu debuggen, wenn etwas nicht mit SQL funktioniert.

5
Ninad Desai
Try...
function getLastQuery($model) {
    $dbo = $model->getDatasource();
    $logData = $dbo->getLog();
    $getLog = end($logData['log']);
    echo $getLog['query'];
}
4
Indrajeet Singh

Einfache Möglichkeit, alle ausgeführten Abfragen Ihres Modells anzuzeigen:

  $sqllog = $this->ModelName->getDataSource()->getLog(false, false);       
  debug($sqllog);
2
Faisal
class YourController extends AppController {
    function testfunc(){
        $this->Model->find('all', $options);
        echo 'SQL: '.$this->getLastQuery();
    }

    function getLastQuery()
    {
        $dbo = ConnectionManager::getDataSource('default');
        $logs = $dbo->getLog();
        $lastLog = end($logs['log']);
        return $lastLog['query'];
    }
}

oder Sie können die gesamte Abfrage abrufen, indem Sie in lib/Cake/Model/DataSource.php die Funktion execute () hinzufügen

Debugger::dump($sql);
1
Sadee

setzen Sie die Debug-Variable in app/config/config.php auf 2.

echo $this->Payment->save();

Ausgeben wie => SQL-Abfrage: INSERT INTO photoora_photoorange.payments VALUES (*******)

[Anfrage einfügen] [2]

0
palkesh