[php] 쿼리 빌더가 원시 SQL 쿼리를 문자열로 출력하도록하려면 어떻게해야합니까?

다음 코드가 주어진다 :

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