2012-05-17 2 views
10

에서 사용하는 SQL을 인쇄하는 IYII - 어떻게 findall은

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

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

이는 findall은 사용하는 SQL에 접근 가능 DB를 일부 기록을 얻을 수있는 다음 코드가? 디버그 콘솔에서 가져올 수 있습니다. 하지만 yiic.php를 사용하여 백그라운드에서 스크립트를 실행하고 있습니다.

답변

16

실행 된 쿼리를 응용 프로그램 로그에 기록하고 검토 할 수 있습니다. 설정 파일에 이런 식으로 뭔가 : 어떤 경우에는

'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);를 호출해야합니다.

물론 로그 된 메시지와 다른 뭔가를하는 자체 로그 경로를 작성하지 않아도되지만 요청이 끝날 때 (또는 processLogs에 전화 할 때) 로그가 처리된다는 것을 염두에 두지 마십시오. , 당신이 뭔가를 기록 할 때마다 아닙니다.


그런데 쿼리에서 동적 입력 권한을 사용하여 이와 같은 쿼리를 작성하면 안됩니다. 대신 사용 바인드 변수 :

$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); 
+0

직접적인 SQL 명령을 사용하는 DAO가 CDbcriteria를 사용하는 것보다 훨씬 간단하고 빠릅니다. – itachi

+3

결과에 따라 원하는 결과에 따라 달라집니다. 모델 기능 (예 : 유효성 검사)을 사용하려면 AR을 사용하는 것이 좋습니다. 개인적으로, 나는 AR을 선호하고, DAO는 join과 관련된 업데이트와 같은보다 복잡한 상황에서만 사용한다. 이렇게하면 공통 조건에 모델 범위를 사용할 수 있으며 스키마 또는 비즈니스 논리가 변경 될 때 직접 명령을 모두 검토/업데이트하지 않아도됩니다. (또한 모든 곳에서 AR을 사용하면 결과 행이 객체 또는 배열인지 걱정할 필요없이 결과에 포함 된 데이터에 일관된 방법으로 액세스 할 수 있습니다.) – DCoder

+0

귀하의 요점이 있습니다. 설명을 위해 고맙습니다. – itachi

1
당신은 당신의 페이지에 직접 로그인 볼 수 있습니다

:

'log'=>array(
    'class'=>'CLogRouter', 
    'routes'=>array(
     array(
      'class'=>'CWebLogRoute', 
     ), 
    ), 
), 
4

당신은 다음과 같이 CDbCommandBuilder을 사용하여 SQL을 얻을 수 있습니다 :

ModelClassName::model()-> getCommandBuilder()-> createFindCommand('tableName', $criteria)->text;

+1

이것은 간단한 쿼리를위한 좋은 해결책이지만 [with]는 고려하지 않았습니다 (https://github.com/yiisoft/yii/blob/1.1.16/framework/db/schema/CDbCommandBuilder.php#L74).) OP의 예에서 언급했다 – Motin

0

당신이 만약 SQL을보기 전에 쿼리를 실행하고 싶지는 않습니다. 실제로는 원하는만큼 쉽지는 않습니다.

이것은 잘못된 것이지만, 개발 중에 만 의도적으로 의도적으로 오류를 추가하고 결과로 Exception을 사용하여 SQL을 시도하려고했습니다.

나는 신뢰할 수없는 일리아의 방법을 발견했다

$criteria = new CDbCriteria(); 
$criteria->condition = 't.date_fgjhfgjfgj 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); 

(이유는 모르겠지만, 때때로 기준은이 방법을 사용하여 무시됩니다).

5
  • 첫 번째 방법 (공식 방법) : 당신의 main.php config 파일에서
    log section 이러한 두 개의 매개 변수를 추가하고 페이지 또는 브라우저에서 FireBug Console의 말에 로그 메시지를 볼 수 있습니다. db 섹션에 필수 매개 변수를 설정하는 것을 잊지 마십시오.

    '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, ), ), ), );

  • 두 번째 방법

  • : 코드에서
    그냥 잘못된 뭔가에 열 중 하나의 철자를 변경하고 오류 메시지가 얻을 것이다 귀하의 오류 페이지에 전체 SQL 쿼리를 포함 (당신이해야 YII_DEBUG 모드가 참).이 같은 :
    (내가 t.wrong_datet.date을 변경 한 당신이 당신의 페이지를 새로 고침 할 때, 당신은 당신의 데이터베이스에 실행 된 생성 된 SQL이 표시됩니다)

$criteria = new CDbCriteria(); $criteria->condition = 't.wrong_date BETWEEN "'.$from_date.'" AND "'.$to_date.'"'; $criteria->with = array('order'); $orders = ProductOrder::model()->findAll($criteria);

YII_DEBUG 인 경우 index.php

defined('YII_DEBUG') or define('YII_DEBUG',true); 
+1

나는 항상 두 번째 것을 사용한다. – Xcoder