복붙노트

[SQL] 어떻게해야합니까 문자열로 출력 원시 SQL 쿼리에 쿼리 작성기를 가져옵니다?

SQL

어떻게해야합니까 문자열로 출력 원시 SQL 쿼리에 쿼리 작성기를 가져옵니다?

다음 코드를 감안할 때 :

DB::table('users')->get();

나는 데이터베이스 쿼리 빌더 위에서 생성하는 원시 SQL 쿼리 문자열을 얻을합니다. 이 예에서는 사용자가 SELECT * FROM 될 것이다.

이걸 어떻게해야합니까?

해결법

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

    1.화면에 출력 할 수있는 마지막 쿼리는 당신이 사용할 수있는 실행 :

    화면에 출력 할 수있는 마지막 쿼리는 당신이 사용할 수있는 실행 :

    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"
      }
    }
    

    (아래 여호수아의 의견에 감사합니다.)

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

    2.QueryBuilder 인스턴스에 toSql () 메서드를 사용합니다.

    QueryBuilder 인스턴스에 toSql () 메서드를 사용합니다.

    DB :: 표 ( '사용자') -> toSql은 () 반환합니다 :

    이 이벤트 리스너를 배선 더 쉽게, 또한 당신은 당신이 그것을 구축하는 동안 쿼리가 실제로 어떤 시점에서 어떻게 보이는지 확인할 수 있습니다.

  3. ==============================

    3.당신이 실행 한 후 DB :: QueryLog ()는 작업 쿼리 $ builder->의 get (). 쿼리를 얻으려면 전에 당신이 $ builder-> toSql () 메서드를 사용하여 쿼리를 실행합니다. 이것은 SQL 및 바인드를 얻는 방법의 예입니다 :

    당신이 실행 한 후 DB :: QueryLog ()는 작업 쿼리 $ builder->의 get (). 쿼리를 얻으려면 전에 당신이 $ builder-> toSql () 메서드를 사용하여 쿼리를 실행합니다. 이것은 SQL 및 바인드를 얻는 방법의 예입니다 :

        $query = str_replace(array('?'), array('\'%s\''), $builder->toSql());
        $query = vsprintf($query, $builder->getBindings());
        dump($query);
    
        $result = $builder->get();
    

    아니면 그냥 유넥 시스트 테이블 또는 열을 요구처럼 쿼리 오류를 확인 u는 예외 XD에서 생성 된 쿼리를 볼 수 있습니다

  4. ==============================

    4.당신은 'illuminate.query'이벤트를 수신 할 수 있습니다. 쿼리하기 전에 다음과 같은 이벤트 리스너를 추가 :

    당신은 '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"
    }
    
  5. ==============================

    5.당신은 Laravel 사용하지 않고를 분명히을 사용하여 로그인을 얻기 위해 시도하는 경우 :

    당신은 Laravel 사용하지 않고를 분명히을 사용하여 로그인을 얻기 위해 시도하는 경우 :

    \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;
    }
    

    편집하다

    업데이트 된 버전은 기본 (위의 반환 하늘의 배열)으로 사용 쿼리 로깅을 갖고있는 것 같다. 캡슐 관리자를 초기화하는 경우 다시 켜려면 연결의 인스턴스를 움켜 잡고 enableQueryLog 메소드를 호출

    $capsule::connection()->enableQueryLog();
    

    편집 다시

    고려 실제 질문을 가지고 가서, 당신은 실제로 이전의 모든 쿼리 대신 현재 단일 쿼리를 변환하려면 다음을 수행 할 수 있습니다 :

    $sql = $query->toSql();
    $bindings = $query->getBindings();
    
  6. ==============================

    6.쿼리 문자열을 얻기를위한 설득력있는 방법이있다.

    쿼리 문자열을 얻기를위한 설득력있는 방법이있다.

    toSql ()

    우리의 경우,

     DB::table('users')->toSql(); 
    

    반환

    select * from users
    

    SQL 쿼리 string..Hope이 도움을 반환 정확한 솔루션입니다 ...

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

    7.

    $data = User::toSql();
    echo $data; //this will retrun select * from users. //here User is model
    
  8. ==============================

    8.당신이 laravel 5.1와 MySQL을 사용하는 경우 당신은 나를 만든이 기능을 사용할 수 있습니다 :

    당신이 laravel 5.1와 MySQL을 사용하는 경우 당신은 나를 만든이 기능을 사용할 수 있습니다 :

    /*
     *  returns SQL with values in it
     */
    function getSql($model)
    {
        $replace = function ($sql, $bindings)
        {
            $needle = '?';
            foreach ($bindings as $replace){
                $pos = strpos($sql, $needle);
                if ($pos !== false) {
                    if (gettype($replace) === "string") {
                         $replace = ' "'.addslashes($replace).'" ';
                    }
                    $sql = substr_replace($sql, $replace, $pos, strlen($needle));
                }
            }
            return $sql;
        };
        $sql = $replace($model->toSql(), $model->getBindings());
    
        return $sql;
    }
    

    당신이 중 하나를 사용할 수 있습니다 매개 변수를 입력으로

  9. ==============================

    9.먼저 당신은 호출하여 쿼리 로그를 활성화해야합니다 :

    먼저 당신은 호출하여 쿼리 로그를 활성화해야합니다 :

    DB::enableQueryLog();
    

    DB를를 사용하는 쿼리가 외관 후 당신은 쓸 수 있습니다 :

    dd(DB::getQueryLog());
    

    출력은 다음과 같은 것입니다 :

    array:1 [▼
      0 => array:3 [▼
        "query" => "select * from `users` left join `website_user` on `users`.`id` = `website_user`.`user_id` left join `region_user` on `users`.`id` = `region_user`.`user_id` left ▶"
        "bindings" => array:5 [▶]
        "time" => 3.79
      ]
    ]
    
  10. ==============================

    10.이것은이 잘 논의되었지만 내가 디버그 - 보내고 웅변 마지막 쿼리 또는 최종 쿼리 중 하나에 제안 할 수있는 지금까지 최고의 솔루션입니다 :

    이것은이 잘 논의되었지만 내가 디버그 - 보내고 웅변 마지막 쿼리 또는 최종 쿼리 중 하나에 제안 할 수있는 지금까지 최고의 솔루션입니다 :

    // query builder
    $query = DB::table('table_name')->where('id', 1);
    
    // binding replaced
    $sql = str_replace_array('?', $query->getBindings(), $query->toSql());
    
    // for laravel 5.8^
    $sql = Str::replaceArray('?', $query->getBindings(), $query->toSql());
    
    // print
    dd($sql);
    
  11. ==============================

    11.단순히 당신이 toSql () 메소드를 사용하여 물건을 다음을 수행 할 수 있습니다,

    단순히 당신이 toSql () 메소드를 사용하여 물건을 다음을 수행 할 수 있습니다,

    $query = DB::table('users')->get();
    
    echo $query->toSql();
    

    그것이 작동하지 않는 경우에 당신은 설정 할 수 laravel 문서에서 일을.

    그것을 할 수있는 또 다른 방법은

    DB :: getQueryLog ()

    이 반환 하늘의 배열은 기본적으로 다음의 경우하지만,이 비활성화 방문의

    다만 DB :: enableQueryLog (함께 사용 가능) 그것은 작동합니다 :)

    추가 정보를 원하시면 방문 Github의 문제는 더 그것에 대해 알 수있는.

    희망이 도움이 :)

  12. ==============================

    12.A 'macroable'교체 바인딩과 함께 SQL 쿼리를 얻을 수 있습니다.

    A 'macroable'교체 바인딩과 함께 SQL 쿼리를 얻을 수 있습니다.

    예를 들면 웅변 빌더 (Laravel 5.1-5.3)

    \Log::debug(\App\User::limit(1)->getQuery()->toRawSql());
    
  13. ==============================

    13.사용 debugbar 패키지

    사용 debugbar 패키지

    composer require "barryvdh/laravel-debugbar": "2.3.*"
    

  14. ==============================

    14.laravel 5.2 이후부터. 당신은 :: DB를 사용하는 실행 쿼리를 얻을들을 수 있습니다.

    laravel 5.2 이후부터. 당신은 :: DB를 사용하는 실행 쿼리를 얻을들을 수 있습니다.

    DB::listen(function ($query) {
        // $query->sql
        // $query->bindings
        // $query->time
    });
    

    단일 빌더 인스턴스를 디버깅 할 경우 또는 당신은 toSql 방법을 사용할 수 있습니다.

    DB::table('posts')->toSql(); 
    
  15. ==============================

    15.가장 쉬운 방법은 고의적 인 실수를하는 것입니다. 예를 들어, 나는 다음과 같은 관계의 전체 SQL 쿼리를보고 싶어 :

    가장 쉬운 방법은 고의적 인 실수를하는 것입니다. 예를 들어, 나는 다음과 같은 관계의 전체 SQL 쿼리를보고 싶어 :

     public function jobs()
            {
                return $this->belongsToMany(Job::class, 'eqtype_jobs')
                       ->withPivot(['created_at','updated_at','id'])
                       ->orderBy('pivot_created_at','desc');
            }
    

    난 그냥 발견되지 수에 열을 만들기 위해, 나는 여기 created_at를 선택하고 난 수의 후행 추가하여 created_ats로 변경 :

    public function jobs()
                {
                    return $this->belongsToMany(Job::class, 'eqtype_jobs')
                           ->withPivot(['created_ats','updated_at','id'])
                           ->orderBy('pivot_created_at','desc');
                }
    

    그래서, 디버거는 다음과 같은 오류를 반환합니다 :

    위의 오류 메시지가 실수로 전체 SQL 쿼리를 반환

    SQL: select  jobs.*, eqtype_jobs.set_id as pivot_set_id,  eqtype_jobs.job_id as pivot_job_id, eqtype_jobs.created_ats as pivot_created_ats, eqtype_jobs.updated_at as  pivot_updated_at, eqtype_jobs.id as pivot_id from jobs inner join eqtype_jobs on jobs.id = eqtype_jobs.job_id where  eqtype_jobs.set_id = 56 order by pivot_created_at desc limit 20 offset 0
    

    이제 막 created_at에서 별도의 제거 및 phpMyAdmin을 SQL 편집기와 같은 SQL 편집기에서처럼으로이 SQL을 테스트!

  16. ==============================

    16.

    DB::enableQueryLog();
    
    $queries = DB::getQueryLog();
    
  17. ==============================

    17.이 기능입니다, 내 기본 모델 클래스에 배치. 단순히 그것으로 쿼리 빌더 객체를 전달하고 SQL 문자열이 반환됩니다.

    이 기능입니다, 내 기본 모델 클래스에 배치. 단순히 그것으로 쿼리 빌더 객체를 전달하고 SQL 문자열이 반환됩니다.

    function getSQL($builder) {
      $sql = $builder->toSql();
      foreach ( $builder->getBindings() as $binding ) {
        $value = is_numeric($binding) ? $binding : "'".$binding."'";
        $sql = preg_replace('/\?/', $value, $sql, 1);
      }
      return $sql;
    }
    
  18. ==============================

    18.laravel의 5.5.X의 경우

    laravel의 5.5.X의 경우

    당신이 당신의 응용 프로그램에서 실행되는 각 SQL 쿼리를 받고자하는 경우, 당신은이 방법들을 사용할 수있다. 이 방법은 쿼리를 로그인하거나 디버깅하는 데 유용합니다. 당신은 서비스 제공 업체에서 쿼리 리스너를 등록 할 수 있습니다 :

    <?php
    
    namespace App\Providers;
    
    use Illuminate\Support\Facades\DB;
    use Illuminate\Support\ServiceProvider;
    
    class AppServiceProvider extends ServiceProvider
    {
        /**
         * Bootstrap any application services.
         *
         * @return void
         */
        public function boot()
        {
            DB::listen(function ($query) {
                // $query->sql
                // $query->bindings
                // $query->time
            });
        }
    
        /**
         * Register the service provider.
         *
         * @return void
         */
        public function register()
        {
            //
        }
    }
    

    출처

  19. ==============================

    19.당신이 할 수 있도록 Laravel 5.8.15 현재 쿼리 빌더는 이제 DD와 덤프 방법이있다

    당신이 할 수 있도록 Laravel 5.8.15 현재 쿼리 빌더는 이제 DD와 덤프 방법이있다

    DB::table('data')->where('a', 1)->dump();
    
  20. ==============================

    20.응용 프로그램에이 기능을 추가하고 단순히 호출합니다.

    응용 프로그램에이 기능을 추가하고 단순히 호출합니다.

    function getQuery($sql){
            $query = str_replace(array('?'), array('\'%s\''), $sql->toSql());
            $query = vsprintf($query, $sql->getBindings());     
            return $query;
    }
    

    출력 "사용자로부터 선택 * 여기서 DESC 제한 updated_at 25 0 오프셋 의해 랭 ="EN "상태 = '1'주문 '

  21. ==============================

    21.마지막으로 쿼리를 인쇄

    마지막으로 쿼리를 인쇄

    DB::enableQueryLog();
    
    $query        = DB::getQueryLog();
    $lastQuery    = end($query);
    print_r($lastQuery);
    
  22. ==============================

    22.제 생각에는,이 초보자로서 가장 좋은 방법이 될 것입니다 :

    제 생각에는,이 초보자로서 가장 좋은 방법이 될 것입니다 :

    echo "<pre>";
    print_r($query->toSql());
    print_r($query->getBindings());
    

    이것은 또한 여기에 묘사되어있다. https://stackoverflow.com/a/59207557/9573341

  23. ==============================

    23.당신이 당신의 페이지를로드 할 때 실행되는 모든 쿼리를 얻기위한이 패키지를 사용할 수 있습니다

    당신이 당신의 페이지를로드 할 때 실행되는 모든 쿼리를 얻기위한이 패키지를 사용할 수 있습니다

    https://github.com/barryvdh/laravel-debugbar
    
  24. ==============================

    24.당신이 Laravel를 사용하지만 설득력 패키지를 사용하지 않는 경우 :

    당신이 Laravel를 사용하지만 설득력 패키지를 사용하지 않는 경우 :

    use \Illuminate\Database\Capsule\Manager as Capsule;
    use \Illuminate\Events\Dispatcher;
    use \Illuminate\Container\Container;
    
    $capsule = new Capsule;
    
    $capsule->addConnection([
        // connection details
    ]);
    // Set the event dispatcher used by Eloquent models... (optional)
    $capsule->setEventDispatcher(new Dispatcher(new Container));
    
    // Make this Capsule instance available globally via static methods... (optional)
    $capsule->setAsGlobal();
    
    // Setup the Eloquent ORM...(optional unless you've used setEventDispatcher())
    $capsule->bootEloquent();
    
    // Listen for Query Events for Debug
    $events = new Dispatcher;
    $events->listen('illuminate.query', function($query, $bindings, $time, $name)
    {
        // Format binding data for sql insertion
        foreach ($bindings as $i => $binding) {
            if ($binding instanceof \DateTime) {
                $bindings[$i] = $binding->format('\'Y-m-d H:i:s\'');
            } else if (is_string($binding)) {
                $bindings[$i] = "'$binding'";`enter code here`
            }
        }
    
        // Insert bindings into query
        $query = str_replace(array('%', '?'), array('%%', '%s'), $query);
        $query = vsprintf($query, $bindings);
    
        // Debug SQL queries
        echo 'SQL: [' . $query . ']';
    });
    
    $capsule->setEventDispatcher($events);
    
  25. ==============================

    25.당신은 시계를 사용할 수 있습니다

    당신은 시계를 사용할 수 있습니다

    하지만 파이어 폭스에서도 작동

  26. ==============================

    26.나는 일부 쿼리의 SQL 및 바인딩을 얻기 위해 몇 가지 간단한 기능을 만들었습니다.

    나는 일부 쿼리의 SQL 및 바인딩을 얻기 위해 몇 가지 간단한 기능을 만들었습니다.

    /**
     * getSql
     *
     * Usage:
     * getSql( DB::table("users") )
     * 
     * Get the current SQL and bindings
     * 
     * @param  mixed  $query  Relation / Eloquent Builder / Query Builder
     * @return array          Array with sql and bindings or else false
     */
    function getSql($query)
    {
        if( $query instanceof Illuminate\Database\Eloquent\Relations\Relation )
        {
            $query = $query->getBaseQuery();
        }
    
        if( $query instanceof Illuminate\Database\Eloquent\Builder )
        {
            $query = $query->getQuery();
        }
    
        if( $query instanceof Illuminate\Database\Query\Builder )
        {
            return [ 'query' => $query->toSql(), 'bindings' => $query->getBindings() ];
        }
    
        return false;
    }
    
    /**
     * logQuery
     *
     * Get the SQL from a query in a closure
     *
     * Usage:
     * logQueries(function() {
     *     return User::first()->applications;
     * });
     * 
     * @param  closure $callback              function to call some queries in
     * @return Illuminate\Support\Collection  Collection of queries
     */
    function logQueries(closure $callback) 
    {
        // check if query logging is enabled
        $logging = DB::logging();
    
        // Get number of queries
        $numberOfQueries = count(DB::getQueryLog());
    
        // if logging not enabled, temporarily enable it
        if( !$logging ) DB::enableQueryLog();
    
        $query = $callback();
    
        $lastQuery = getSql($query);
    
        // Get querylog
        $queries = new Illuminate\Support\Collection( DB::getQueryLog() );
    
        // calculate the number of queries done in callback
        $queryCount = $queries->count() - $numberOfQueries;
    
        // Get last queries
        $lastQueries = $queries->take(-$queryCount);
    
        // disable query logging
        if( !$logging ) DB::disableQueryLog();
    
        // if callback returns a builder object, return the sql and bindings of it
        if( $lastQuery )
        {
            $lastQueries->push($lastQuery);
        }
    
        return $lastQueries;
    }
    

    용법:

    getSql( DB::table('users') );
    // returns 
    // [
    //     "sql" => "select * from `users`",
    //     "bindings" => [],
    // ]
    
    getSql( $project->rooms() );
    // returns
    // [
    //     "sql" => "select * from `rooms` where `rooms`.`project_id` = ? and `rooms`.`project_id` is not null",
    //     "bindings" => [ 7 ],
    // ]
    
  27. ==============================

    27.나는이 프레임 워크를 사랑하는이 쓰레기 같은 역할을 할 때만큼, 난 싫어.

    나는이 프레임 워크를 사랑하는이 쓰레기 같은 역할을 할 때만큼, 난 싫어.

    DB :: enableQueryLog ()는 완전히 쓸모. 듣기 :: DB 똑같이 쓸모가 없다. 내가 말한 때 쿼리의 일부를 보여 주었다 $ 질의 -> 수 (),하지만 난) $ 질의 -> GET (할 경우, 그것은 말할 것도 없습니다.

    이 나타납니다 지속적으로 작업 할 수있는 유일한 해결책은 의도적으로, 존재하지 않는 열 / 테이블 이름처럼 ORM 매개 변수에 어떤 구문이나 다른 오류를 넣어 디버그 모드 인 상태에서 명령 줄에서 코드를 실행하는 것입니다, 그리고 그것은 SQL 오류를 뱉어 마지막으로 전체 폭발 해 '쿼리. 그렇지 않으면, 희망 에러는 웹 서버에서 실행하는 경우 로그 파일에 나타납니다.

  28. ==============================

    28.이 시도:

    이 시도:

    $results = DB::table('users')->toSql();
    dd($results);
    

    참고 : 수 ()는 원시 SQL 쿼리를 표시 toSql ()로 대체되었습니다.

  29. ==============================

    29.당신이 어설프게를 사용하여 로그인 할 경우 SQL 쿼리는 당신이 할 수있는 형성

    당신이 어설프게를 사용하여 로그인 할 경우 SQL 쿼리는 당신이 할 수있는 형성

    $ php artisan tinker
    Psy Shell v0.9.9 (PHP 7.3.5 — cli) by Justin Hileman
    >>> DB::listen(function ($query) { dump($query->sql); dump($query->bindings); dump($query->time); });
    => null
    >>> App\User::find(1)
    "select * from `users` where `users`.`id` = ? limit 1"
    array:1 [
      0 => 1
    ]
    6.99
    => App\User {#3131
         id: 1,
         name: "admin",
         email: "admin@example.com",
         created_at: "2019-01-11 19:06:23",
         updated_at: "2019-01-11 19:06:23",
       }
    >>>
    
  30. ==============================

    30.로그보기에 따라이 일을 내 방법은, 오직 파일 응용 프로그램 / 공급자를 수정해야 / AppServiceProvider.php를 :

    로그보기에 따라이 일을 내 방법은, 오직 파일 응용 프로그램 / 공급자를 수정해야 / AppServiceProvider.php를 :

    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        //
        DB::listen(function ($query) {
            $querySql = str_replace(['?'], ['\'%s\''], $query->sql);
            $queryRawSql = vsprintf($querySql, $query->bindings);
            Log::debug('[SQL EXEC]', [
                    "raw sql"  => $queryRawSql,
                    "time" => $query->time,
                ]
            );
        });
    }
    
    $users = DB::table('users')
        ->select(DB::raw('count(*) as user_count, username '))
        ->where('uid', '>=', 10)
        ->limit(100)
        ->groupBy('username')
        ->get()
    ;
    dd($users);
    
    [2019-10-27 17:39:17] local.DEBUG: [SQL EXEC] {"raw sql":"select count(*) as user_count, username  from `users` where `uid` >= '10' group by `username` limit 100","time":304.21} 
    
  31. from https://stackoverflow.com/questions/18236294/how-do-i-get-the-query-builder-to-output-its-raw-sql-query-as-a-string by cc-by-sa and MIT license