web-dev-qa-db-fra.com

cakephp voir la requête SQL compilée avant exécution

Ma requête obtient l'erreur de délai d'attente à chaque exécution. C'est une pagination avec des jointures.
Je veux déboguer le SQL, mais depuis que j'ai un délai d'attente, je ne le vois pas.

Comment puis-je voir la requête SQL compilée avant exécution?


Un code de gâteau:

$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

Tout d’abord, définissez la variable debug sur 2 dans app/config/config.php.

Puis ajouter:

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

à la fin de votre mise en page. Cela devrait en fait être commenté dans votre mise en page de gâteau par défaut. 

Vous pourrez maintenant voir toutes les requêtes SQL qui vont à la base de données.

Maintenant, copiez la requête et utilisez la commande SQL EXPLAIN (le lien concerne MySQL) sur la base de données pour voir ce que la requête fait dans DBMS . Pour plus d'informations sur le débogage de CakePHP, consultez ici .

Comme votre script ne rend même pas, vous pouvez essayer d'obtenir le dernier journal directement à partir de la source de données avec:

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

Cela doit être dans un modèle car la fonction getDatasource() est définie dans un modèle. Inspectez la variable $logs entière et voyez ce qu’elle contient.

27
Borislav Sabev

Une dernière chose à faire est de… 

Allez dans Cake/Model/DataSource/DboSource.php et localisez la fonction execute () et imprimez la variable $ sql. Cela devrait imprimer le SQL.

Ce n'est certainement pas le moyen le plus propre (car vous changez de répertoire Cake) .. mais il serait certainement plus rapide de déboguer si quelque chose ne fonctionne pas avec SQL.

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

Un moyen simple d'afficher toutes les requêtes exécutées de votre modèle donné:

  $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'];
    }
}

ou vous pouvez obtenir toute la requête en ajoutant la ligne suivante à la fonction execute () dans lib/Cake/Model/DataSource.php

Debugger::dump($sql);
1
Sadee

définissez la variable de débogage sur 2 dans app/config/config.php.

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

Sort mis comme => requête SQL: INSERT INTO photoora_photoorange.payments VALUES (*******)

[insérer la requête] [2]

0
palkesh