다음 코드가 주어진다 :
DB::table('users')->get();
위의 데이터베이스 쿼리 작성기가 생성 할 원시 SQL 쿼리 문자열을 가져오고 싶습니다. 이 예에서는입니다 SELECT * FROM users
.
어떻게해야합니까?
답변
마지막 쿼리가 실행 된 화면으로 출력하려면 다음을 사용할 수 있습니다.
DB::enableQueryLog(); // Enable query log
// Your Eloquent query executed by using get()
dd(DB::getQueryLog()); // Show results of log
가장 최근의 쿼리는 배열의 맨 아래에 있다고 생각합니다.
당신은 그런 것을 가질 것입니다 :
array(1) {
[0]=>
array(3) {
["query"]=>
string(21) "select * from "users""
["bindings"]=>
array(0) {
}
["time"]=>
string(4) "0.92"
}
}
( 아래 Joshua의 의견에 감사드립니다 .)
답변
인스턴스 에서 toSql()
메소드를 사용하십시오 QueryBuilder
.
DB::table('users')->toSql()
돌아올 것이다 :
`users`에서 *를 선택하십시오
이것은 이벤트 리스너를 연결하는 것보다 쉬우 며, 쿼리를 작성하는 동안 언제라도 쿼리가 실제로 어떻게 보이는지 확인할 수 있습니다.
답변
DB::QueryLog()
쿼리를 실행 한 후에 만 작동합니다 $builder->get()
. 쿼리를 실행하기 전에 쿼리를 얻으려면 $builder->toSql()
method 를 사용할 수 있습니다 . 다음은 SQL을 가져 와서 바인딩하는 방법의 예입니다.
$query = str_replace(array('?'), array('\'%s\''), $builder->toSql());
$query = vsprintf($query, $builder->getBindings());
dump($query);
$result = $builder->get();
또는 존재하지 않는 테이블이나 열을 호출하는 것과 같은 쿼리 오류를 만들면 예외 XD에서 생성 된 쿼리가 표시됩니다.
답변
‘illuminate.query’이벤트를들을 수 있습니다. 조회 전에 다음 이벤트 리스너를 추가하십시오.
Event::listen('illuminate.query', function($query, $params, $time, $conn)
{
dd(array($query, $params, $time, $conn));
});
DB::table('users')->get();
다음과 같은 내용이 인쇄됩니다.
array(4) {
[0]=>
string(21) "select * from "users""
[1]=>
array(0) {
}
[2]=>
string(4) "0.94"
[3]=>
string(6) "sqlite"
}
답변
Laravel을 사용하지 않고 Illuminate를 사용하여 로그를 얻으려고 시도하는 경우 :
\Illuminate\Database\Capsule\Manager::getQueryLog();
다음과 같이 빠른 기능을 사용할 수도 있습니다.
function logger() {
$queries = \Illuminate\Database\Capsule\Manager::getQueryLog();
$formattedQueries = [];
foreach( $queries as $query ) :
$prep = $query['query'];
foreach( $query['bindings'] as $binding ) :
$prep = preg_replace("#\?#", is_numeric($binding) ? $binding : "'" . $binding . "'", $prep, 1);
endforeach;
$formattedQueries[] = $prep;
endforeach;
return $formattedQueries;
}
편집하다
업데이트 된 버전은 기본적으로 쿼리 로깅을 사용하지 않는 것으로 보입니다 (위는 빈 배열을 반환 함). 다시 켜려면 Capsule Manager를 초기화 할 때 연결 인스턴스를 잡고 enableQueryLog
메소드를 호출하십시오.
$capsule::connection()->enableQueryLog();
다시 편집
실제 질문을 고려하면 실제로 모든 이전 쿼리 대신 현재 단일 쿼리를 변환하기 위해 다음을 수행 할 수 있습니다.
$sql = $query->toSql();
$bindings = $query->getBindings();
답변
쿼리 문자열을 얻는 데는 웅변적인 방법이 있습니다.
toSql ()
우리의 경우
DB::table('users')->toSql();
반환
select * from users
SQL 쿼리 문자열을 반환하는 정확한 솔루션입니다.
답변
$data = User::toSql();
echo $data; //this will retrun select * from users. //here User is model