복붙노트

[SQL] Yii2와 액티브를 사용하여 실제 SQL 쿼리를 로그?

SQL

Yii2와 액티브를 사용하여 실제 SQL 쿼리를 로그?

나는이 일을 해요 :

$students = Student::find()->all();
    return $this->render('process', array('students' => $students));

다음이 뷰 :

foreach($students as $student)
    {
        echo $student->name . ',  ';
        echo $student->getQuizActivitiesCount(); ?> <br /> <?php
    }

나는 SQL 쿼리가 수행되고보고 싶습니다. 학생은 완벽 퀴즈 활동, 쿼리 수행 "많은있다",하지만 난 원시 SQL을 볼 필요가있다. 이것이 가능한가?

해결법

  1. ==============================

    1.방법 1

    방법 1

    관계로 돌려 YII \ DB \ ActiveQuery 예는 위해서 var_dump로 예를 들어 코드에서 직접 원시 SQL 쿼리를 추출하는 것이 가능하다 ().

    예를 들어 우리는 사용자와 관련이있는 경우 :

    /**
     * @return \yii\db\ActiveQuery
     */
    public function getUser()
    {
        return $this->hasOne(User::className(), ['id' => 'user_id']);
    }
    

    그런 다음 () 같은 원시 SQL을 위해서 var_dump 수 있습니다 :

    var_dump($model->getUser()->prepare(Yii::$app->db->queryBuilder)->createCommand()->rawSql);
    exit();
    

    주 당신이 아니라 $ 모델 ->과 같이 호출해야 사용자 -> (후자의 반환 사용자 인스턴스).

    카운트 () 즉시 INT를 반환하기 때문에 그러나 귀하의 경우는 불가능합니다. 당신은 () 수없는 부분 쿼리 ()를 위해서 var_dump 수 있지만, 나는 그것이 편리하지 생각합니다.

    당신은 예를 들어, (관계에 의해 반환 된 것들뿐만 아니라) 어떤 ActiveQuery 인스턴스의 생성 된 SQL을 덤핑이 방법을 사용할 수 있습니다 :

    $query = User::find()->where(['status' => User::STATUS_ACTIVE]);
    var_dump($query->prepare(Yii::$app->db->queryBuilder)->createCommand()->rawSql);
    exit();
    

    방법 2

    이것은 내 의견에 훨씬 간단하고 SQL 쿼리를 디버깅 할 때 나는 개인적으로이 일을 선호합니다.

    YII 2는 내장 된 디버그 모듈. 그냥 설정이 추가 :

    'modules' => [
        'debug' => [
            'class' => 'yii\debug\Module',
        ],
    ],
    

    당신은 단지 생산에 로컬이 아닌 그것을 가지고 있는지 확인하십시오. 필요한 경우, 또한 allowedIPs 속성을 변경하십시오.

    이렇게하면 페이지 하단의 기능 패널을 제공합니다. DB를 단어를 찾아 횟수 또는 시간 중 하나를 클릭합니다. 이 페이지에서 실행 된 모든 쿼리를 확인하고이를 필터링 할 수 있습니다. 나는 보통 그리드에서 그들을 필터링을 통해 빠르게 이동하려면 표준 브라우저 검색을 사용하고 필요한 쿼리 (예를 들어 키워드로 테이블 이름을 사용)을 찾을 수 없습니다.

    방법 3

    그냥 열 이름에 예를 들어, 쿼리에서 실수를 - 대신 도시의 cityy을. 이 데이터베이스 예외로 발생합니다 그리고 당신은 즉시 오류 메시지가 생성 된 쿼리를 볼 수 있습니다.

  2. ==============================

    2.당신이 콘솔 응용 프로그램의 모든 제안 된 방법에서 액티브의 모든 관계형 쿼리를 기록하려면 도움이되지 않습니다. 그들은, 활성 레코드의 테이블에서만 주요 SQL을 보여 \ YII \ 디버그 \ 모듈은 브라우저에서 작동합니다.

    당신이 콘솔 응용 프로그램의 모든 제안 된 방법에서 액티브의 모든 관계형 쿼리를 기록하려면 도움이되지 않습니다. 그들은, 활성 레코드의 테이블에서만 주요 SQL을 보여 \ YII \ 디버그 \ 모듈은 브라우저에서 작동합니다.

    실행 된 모든 SQL 쿼리를 얻을 수있는 다른 방법은 구성에 특정 FileTarget을 추가하여이를 기록하는 것입니다 :

    'log' => [
        'targets' => [[
            ...
        ], [
            'class' => 'yii\log\FileTarget',
            'logFile' => '@runtime/logs/profile.log',
            'logVars' => [],
            'levels' => ['profile'],
            'categories' => ['yii\db\Command::query'],
            'prefix' => function($message) {
                return '';
            }
        ]]
    ]
    

    최신 정보

    삽입 / 업데이트 / 삭제 쿼리를 기록하기 위해 하나는 YII는 \ DB \ 명령 :: 범주를 실행 추가해야합니다 :

    'categories' => ['yii\db\Command::query', 'yii\db\Command::execute']
    
  3. ==============================

    3.당신은 당신이 쿼리처럼 주어진이 가정이 시도 할 수 있습니다 :

    당신은 당신이 쿼리처럼 주어진이 가정이 시도 할 수 있습니다 :

    $query = new Books::find()->where('author=2');
    echo $query->createCommand()->sql;
    

    또는 모든 매개 변수를 포함 시도와 함께 SQL을 얻을 수 있습니다 :

    $query->createCommand()->getRawSql()
    
  4. ==============================

    4.ActiveQuery 개체를 사용하면 이미 작업, 여기 때 arogachev 대답뿐만 아니라, 라인은 내가 rawsql을 보려면 검색.

    ActiveQuery 개체를 사용하면 이미 작업, 여기 때 arogachev 대답뿐만 아니라, 라인은 내가 rawsql을 보려면 검색.

    /* @var $studentQuery ActiveQuery */
    $studentQuery = Student::Find();
    // Construct the query as you want it
    $studentQuery->where("status=3")->orderBy("grade ASC");
    
    // Get the rawsql
    var_dump($studentQuery->prepare(Yii::$app->db->queryBuilder)->createCommand()->rawSql);
    
    // Run the query
    $studentQuery->all();
    
  5. ==============================

    5.쿼리 개체가있을 때 당신은 또한 사용할 수 있습니다

    쿼리 개체가있을 때 당신은 또한 사용할 수 있습니다

    $query->createCommand()->getRawSql()
    

    매개 변수를 포함하여 원시 SQL을 반환하거나

    $query->createCommand()->sql
    

    를 출력하는 파라미터와 별도로은 SQL.

  6. ==============================

    6.모든 / 모든 쿼리를 추적 / 로그인하려면 :

    모든 / 모든 쿼리를 추적 / 로그인하려면 :

    확장 \ YII \ DB \ 연결 및 다음과 같은 재정의 createCommand 방법에있어서,

    namespace app\base;
    
    class Connection extends \yii\db\Connection {
    
        public function createCommand($sql = null, $params = array()) {
            $createCommand = parent::createCommand($sql, $params);
            $rawSql = $createCommand->getRawSql();
             // ########### $rawSql -> LOG IT / OR DO ANYTHING YOU WANT WITH IT
            return $createCommand;
        }
    }
    

    그런 다음, 간단하게 아래처럼 DB를 설정에서 DB 연결을 변경 :

    'db' => [
            'class' => 'app\base\Connection', //  #### HERE 
            'dsn' => 'pgsql:host=localhost;dbname=dbname',
            'username' => 'uname',
            'password' => 'pwd',
            'charset' => 'utf8',
        ],
    

    지금, 당신은 / 추적 읽을 수있는 / ... DB 연결에 의해 실행되는 모든 쿼리.

  7. ==============================

    7.같은 시도

    같은 시도

    $query = Yii::$app->db->createCommand()
            ->update('table_name', ['title' => 'MyTitle'],['id' => '1']);
    
    var_dump($query->getRawSql()); die();
    $query->execute();
    

    산출:

    string 'UPDATE `table_name` 
            SET `title`='MyTitle' WHERE `id`='1'
    ' (length=204)
    
  8. from https://stackoverflow.com/questions/27389146/log-the-actual-sql-query-using-activerecord-with-yii2 by cc-by-sa and MIT license