Yii - Comment imprimer SQL utilisé par findAll
J'ai le code suivant pour obtenir certains enregistrements de db
$criteria = new CDbCriteria();
$criteria->condition = 't.date BETWEEN "'.$from_date.'" AND "'.$to_date.'"';
$criteria->with = array('order');
$orders = ProductOrder::model()->findAll($criteria);
Est-il possible d'obtenir le SQL utilisé par le findAll? Je sais que vous pouvez obtenir à partir de la console de débogage. Mais je suis l'exécution du script en arrière-plan à l'aide de yiic.php
Vous devez vous connecter pour publier un commentaire.
Vous pouvez enregistrer les requêtes exécutées dans le journal d'application et de révision. Quelque chose comme ceci dans le fichier de configuration:
Dans certains cas (par exemple lors de l'exécution des tests), vous aurez également besoin d'appeler
Yii::app()->log->processLogs(null);
à la fin du processus pour que cela fonctionne.Bien sûr, une fois que vous y êtes, rien ne vous empêche de rédiger votre propre journal de route qui fait quelque chose de différent avec les messages consignés, mais l'esprit que les journaux sont traitées à la fin de la requête (ou lorsque vous appelez
processLogs
), et pas à chaque fois que vous vous connectez à quelque chose.Par ailleurs, vous ne devez pas créer des requêtes comme ça, avec un droit d'entrée dans la requête. Utilisez bind variables à la place:
Premier moyen(de manière Officielle):
Dans votre
main.php
fichier de configuration ajout de ces deux paramètres dans votrelog section
et vous pouvez voir les messages de journal à la fin de votre page ouFireBug Console
dans votre navigateur. n'oubliez pas de définir les paramètres nécessaires dansdb
section.'components' => array(
'db'=>array(
'enableProfiling'=>true,
'enableParamLogging' => true,
),
'log'=>array(
'class'=>'CLogRouter',
'routes'=>array(
array(
'class'=>'CWebLogRoute',
'showInFireBug' => true,
),
array(
'class'=>'CProfileLogRoute',
'levels'=>'profile',
'enabled'=>true,
),
),
),
);
Deuxième façon:
Dans votre code, il suffit de changer l'orthographe de l'une de vos colonnes pour quelque chose d'incorrect, et vous obtiendrez un message d'erreur contient l'ensemble de la requête SQL dans votre page d'erreur(vous devriez être en
YII_DEBUG
mode de vrai). quelque chose comme ceci:(j'ai changé
t.date
àt.wrong_date
, lorsque vous actualisez votre page, vous pourrez voir le SQL généré qui a été exécuté dans votre base de données)dans les deux sens, ont
YII_DEBUG
vrai dansindex.php
Vous pouvez obtenir sql en utilisant CDbCommandBuilder, comme ceci:
ModelClassName::model()->
getCommandBuilder()->
createFindCommand('tableName', $criteria)->text;
Vous pouvez voir le journal directement sur votre page:
Si vous ne voulez pas exécuter la requête avant de voir le SQL, ce n'est pas aussi facile que vous pourriez espérer.
C'est aussi sale que de mal, mais, quand en développement seulement, dans le passé j'ai pris à l'ajout d'un délibérée délibérée d'une erreur dans les critères et en s'appuyant sur l'Exception de donner le SQL tentée.
par exemple
J'ai trouvé Ilya méthode peu fiable (je ne sais pas pourquoi, mais parfois, les critères sont ignorées en utilisant cette méthode).