[SQL] Yii2와 액티브를 사용하여 실제 SQL 쿼리를 로그?
SQLYii2와 액티브를 사용하여 실제 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
관계로 돌려 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.당신이 콘솔 응용 프로그램의 모든 제안 된 방법에서 액티브의 모든 관계형 쿼리를 기록하려면 도움이되지 않습니다. 그들은, 활성 레코드의 테이블에서만 주요 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.당신은 당신이 쿼리처럼 주어진이 가정이 시도 할 수 있습니다 :
당신은 당신이 쿼리처럼 주어진이 가정이 시도 할 수 있습니다 :
$query = new Books::find()->where('author=2'); echo $query->createCommand()->sql;
또는 모든 매개 변수를 포함 시도와 함께 SQL을 얻을 수 있습니다 :
$query->createCommand()->getRawSql()
-
==============================
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.쿼리 개체가있을 때 당신은 또한 사용할 수 있습니다
쿼리 개체가있을 때 당신은 또한 사용할 수 있습니다
$query->createCommand()->getRawSql()
매개 변수를 포함하여 원시 SQL을 반환하거나
$query->createCommand()->sql
를 출력하는 파라미터와 별도로은 SQL.
-
==============================
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.같은 시도
같은 시도
$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)
from https://stackoverflow.com/questions/27389146/log-the-actual-sql-query-using-activerecord-with-yii2 by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 삽입 등) (최대 + 1 문제 설정치 (0) | 2020.06.04 |
---|---|
[SQL] JDBC 더비 드라이버를 찾을 수 없습니다 (0) | 2020.06.04 |
[SQL] 어떻게 레코드를 삽입하고 하나의하는 SqlCommand를 사용하여 새로 생성 된 ID를 반환? (0) | 2020.06.04 |
[SQL] 어떻게 무시하는 "중복 키"T-SQL의 오류 (SQL 서버) (0) | 2020.06.04 |
[SQL] 어떻게 PostgreSQL을에있는 테이블의 목록 열 이름과 데이터 유형을 얻으려면? (0) | 2020.06.04 |