Yii-如何打印findAll使用的SQL [英] Yii - How to print SQL used by findAll

查看:166
本文介绍了Yii-如何打印findAll使用的SQL的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有以下代码从db获取一些记录

I have the following code to get some records from db

    $criteria = new CDbCriteria();
    $criteria->condition = 't.date BETWEEN "'.$from_date.'" AND "'.$to_date.'"';
    $criteria->with = array('order');

    $orders = ProductOrder::model()->findAll($criteria);

是否可以获取findAll使用的SQL?我知道您可以从调试控制台获取它.但是我使用yiic.php在后台运行脚本

Is it possible to get the SQL that is used by the findAll? I know you can get it from the debug console. But I'm running the script in the background using yiic.php

推荐答案

您可以将已执行的查询记录在应用程序日志中并进行查看.配置文件中的内容如下:

You can log the executed queries in the application log and review that. Something like this in the config file:

'components' => array(
  'db'=>array(
    'enableParamLogging' => true,
  ),
  'log'=>array(
    'class'=>'CLogRouter',
    'routes'=>array( 
      array(
        'class'=>'CFileLogRoute',
        'levels'=>'trace,log',
        'categories' => 'system.db.CDbCommand',
        'logFile' => 'db.log',
      ), 
    ),
  ),
);

在某些情况下(例如,运行测试时),您还需要在流程结束时致电Yii::app()->log->processLogs(null);,以使其正常工作.

In some cases (e.g. when running tests), you will also need to call Yii::app()->log->processLogs(null); at the end of the process for this to work.

当然,一旦到达目的地,就不会阻止您编写自己的日志路由,该日志路由会对所记录的消息产生不同的影响,但是请注意,日志是在请求结束时(或在您调用processLogs时)进行处理的),而不是每次您记录一些内容.

Of course, once you're there nothing's stopping you from writing your own log route that does something different with the logged messages, but mind that the logs are processed at the end of the request (or when you call processLogs), not every time you log something.

顺便说一句,您不应该在查询中直接使用动态输入来构建这样的查询.改用绑定变量:

By the way, you should not build queries like that, with dynamic input right in the query. Use bind variables instead:

$criteria = new CDbCriteria();
$criteria->condition = 't.date BETWEEN :from_date AND :to_date';
$criteria->params = array(
  ':from_date' => $from_date,
  ':to_date' => $to_date,
);
$criteria->with = array('order');

$orders = ProductOrder::model()->findAll($criteria);

这篇关于Yii-如何打印findAll使用的SQL的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆