[SQL] 어떻게해야합니까 문자열로 출력 원시 SQL 쿼리에 쿼리 작성기를 가져옵니다?
SQL어떻게해야합니까 문자열로 출력 원시 SQL 쿼리에 쿼리 작성기를 가져옵니다?
다음 코드를 감안할 때 :
DB::table('users')->get();
나는 데이터베이스 쿼리 빌더 위에서 생성하는 원시 SQL 쿼리 문자열을 얻을합니다. 이 예에서는 사용자가 SELECT * FROM 될 것이다.
이걸 어떻게해야합니까?
해결법
-
==============================
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.QueryBuilder 인스턴스에 toSql () 메서드를 사용합니다.
QueryBuilder 인스턴스에 toSql () 메서드를 사용합니다.
DB :: 표 ( '사용자') -> toSql은 () 반환합니다 :
이 이벤트 리스너를 배선 더 쉽게, 또한 당신은 당신이 그것을 구축하는 동안 쿼리가 실제로 어떤 시점에서 어떻게 보이는지 확인할 수 있습니다.
-
==============================
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.당신은 '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.당신은 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.쿼리 문자열을 얻기를위한 설득력있는 방법이있다.
쿼리 문자열을 얻기를위한 설득력있는 방법이있다.
toSql ()
우리의 경우,
DB::table('users')->toSql();
반환
select * from users
SQL 쿼리 string..Hope이 도움을 반환 정확한 솔루션입니다 ...
-
==============================
7.
$data = User::toSql(); echo $data; //this will retrun select * from users. //here User is model
-
==============================
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.먼저 당신은 호출하여 쿼리 로그를 활성화해야합니다 :
먼저 당신은 호출하여 쿼리 로그를 활성화해야합니다 :
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.이것은이 잘 논의되었지만 내가 디버그 - 보내고 웅변 마지막 쿼리 또는 최종 쿼리 중 하나에 제안 할 수있는 지금까지 최고의 솔루션입니다 :
이것은이 잘 논의되었지만 내가 디버그 - 보내고 웅변 마지막 쿼리 또는 최종 쿼리 중 하나에 제안 할 수있는 지금까지 최고의 솔루션입니다 :
// 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.단순히 당신이 toSql () 메소드를 사용하여 물건을 다음을 수행 할 수 있습니다,
단순히 당신이 toSql () 메소드를 사용하여 물건을 다음을 수행 할 수 있습니다,
$query = DB::table('users')->get(); echo $query->toSql();
그것이 작동하지 않는 경우에 당신은 설정 할 수 laravel 문서에서 일을.
그것을 할 수있는 또 다른 방법은
DB :: getQueryLog ()
이 반환 하늘의 배열은 기본적으로 다음의 경우하지만,이 비활성화 방문의
다만 DB :: enableQueryLog (함께 사용 가능) 그것은 작동합니다 :)
추가 정보를 원하시면 방문 Github의 문제는 더 그것에 대해 알 수있는.
희망이 도움이 :)
-
==============================
12.A 'macroable'교체 바인딩과 함께 SQL 쿼리를 얻을 수 있습니다.
A 'macroable'교체 바인딩과 함께 SQL 쿼리를 얻을 수 있습니다.
예를 들면 웅변 빌더 (Laravel 5.1-5.3)
\Log::debug(\App\User::limit(1)->getQuery()->toRawSql());
-
==============================
13.사용 debugbar 패키지
사용 debugbar 패키지
composer require "barryvdh/laravel-debugbar": "2.3.*"
-
==============================
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.가장 쉬운 방법은 고의적 인 실수를하는 것입니다. 예를 들어, 나는 다음과 같은 관계의 전체 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.
DB::enableQueryLog(); $queries = DB::getQueryLog();
-
==============================
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.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.당신이 할 수 있도록 Laravel 5.8.15 현재 쿼리 빌더는 이제 DD와 덤프 방법이있다
당신이 할 수 있도록 Laravel 5.8.15 현재 쿼리 빌더는 이제 DD와 덤프 방법이있다
DB::table('data')->where('a', 1)->dump();
-
==============================
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.마지막으로 쿼리를 인쇄
마지막으로 쿼리를 인쇄
DB::enableQueryLog(); $query = DB::getQueryLog(); $lastQuery = end($query); print_r($lastQuery);
-
==============================
22.제 생각에는,이 초보자로서 가장 좋은 방법이 될 것입니다 :
제 생각에는,이 초보자로서 가장 좋은 방법이 될 것입니다 :
echo "<pre>"; print_r($query->toSql()); print_r($query->getBindings());
이것은 또한 여기에 묘사되어있다. https://stackoverflow.com/a/59207557/9573341
-
==============================
23.당신이 당신의 페이지를로드 할 때 실행되는 모든 쿼리를 얻기위한이 패키지를 사용할 수 있습니다
당신이 당신의 페이지를로드 할 때 실행되는 모든 쿼리를 얻기위한이 패키지를 사용할 수 있습니다
https://github.com/barryvdh/laravel-debugbar
-
==============================
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.당신은 시계를 사용할 수 있습니다
당신은 시계를 사용할 수 있습니다
하지만 파이어 폭스에서도 작동
-
==============================
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.나는이 프레임 워크를 사랑하는이 쓰레기 같은 역할을 할 때만큼, 난 싫어.
나는이 프레임 워크를 사랑하는이 쓰레기 같은 역할을 할 때만큼, 난 싫어.
DB :: enableQueryLog ()는 완전히 쓸모. 듣기 :: DB 똑같이 쓸모가 없다. 내가 말한 때 쿼리의 일부를 보여 주었다 $ 질의 -> 수 (),하지만 난) $ 질의 -> GET (할 경우, 그것은 말할 것도 없습니다.
이 나타납니다 지속적으로 작업 할 수있는 유일한 해결책은 의도적으로, 존재하지 않는 열 / 테이블 이름처럼 ORM 매개 변수에 어떤 구문이나 다른 오류를 넣어 디버그 모드 인 상태에서 명령 줄에서 코드를 실행하는 것입니다, 그리고 그것은 SQL 오류를 뱉어 마지막으로 전체 폭발 해 '쿼리. 그렇지 않으면, 희망 에러는 웹 서버에서 실행하는 경우 로그 파일에 나타납니다.
-
==============================
28.이 시도:
이 시도:
$results = DB::table('users')->toSql(); dd($results);
참고 : 수 ()는 원시 SQL 쿼리를 표시 toSql ()로 대체되었습니다.
-
==============================
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.로그보기에 따라이 일을 내 방법은, 오직 파일 응용 프로그램 / 공급자를 수정해야 / 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}
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
'SQL' 카테고리의 다른 글
[SQL] MySQL 데이터베이스의 모든 테이블에 대한 기록 수를 가져옵니다 (0) | 2020.03.23 |
---|---|
[SQL] 다중 언어 데이터베이스 설계를위한 최상의 방법은 무엇입니까? [닫은] (0) | 2020.03.23 |
[SQL] 특정 필드에 중복을 찾기 위해 문을 선택 (0) | 2020.03.23 |
[SQL] 제 3 표에 자신의 FKS 2 개 테이블을 조인하는 데 필요 (0) | 2020.03.23 |
[SQL] 왜 SQL Server는 밀리 초를 잃고있다? (0) | 2020.03.22 |