Laravel 3/4에서 실행 된 쿼리 가져 오기


182

Laravel Query Builder 또는 Eloquent ORM을 사용하여 Laravel 3/4에서 실행 된 원시 SQL 쿼리를 어떻게 검색 할 수 있습니까?

예를 들면 다음과 같습니다.

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

또는:

(posts (id, user_id, ...))

User::find(1)->posts->get();

그렇지 않으면 최소한 laravel.log에 실행 된 모든 쿼리를 어떻게 저장할 수 있습니까?


laravel 5는 어떻습니까?
Chaudhry Waqas

답변:


318

라 라벨 4+

Laravel 4 이상에서는 DB::getQueryLog()실행 된 모든 쿼리를 가져 오려면 전화 해야합니다.

$queries = DB::getQueryLog();
$last_query = end($queries);

또는 프로파일 러 패키지를 다운로드 할 수 있습니다. barryvdh / laravel-debugbar를 추천 합니다. 저장소 에 설치하는 방법에 대한 지시 사항을 읽을 수 있습니다 .

Laravel 5 사용자 참고 사항 :DB::enableQueryLog() 쿼리를 실행하기 전에 전화해야 합니다. 쿼리를 실행하는 행 바로 위 또는 미들웨어 내부.


라 라벨 3

Laravel 3에서는 클래스 Eloquent의 정적 메소드 last_query를 호출 하는 모델 에서 마지막으로 실행 된 쿼리를 얻을 수 있습니다 DB.

DB::last_query();

그러나이 경우 profiler옵션 을 활성화해야합니다 application/config/database.php. 또는 @dualed에서 언급했듯이 profiler옵션을 활성화 application/config/application.php하거나 호출 DB::profile()하여 모든 요청이 현재 요청 및 실행 시간에 실행되도록 할 수 있습니다.


2
Laravel 4의 코드가 작동하지 않습니다. 나는 이것을 얻는다 ErrorException: 경고 : call_user_func_array()매개 변수 1이 유효한 콜백이 될 것으로 기대하고, 클래스 Illuminate\Database\MySqlConnection에는 메소드가 없습니다 getQueryList.
duality_

내 나쁜, 올바른 방법은 getQueryLog입니다. 지금 고쳤습니다. 감사!
rmobis

이상한 ... 쿼리 개체 오류에 last_query ()가 정의되어 있지 않습니다. 나는 인스턴스화되지 않은 Eloquent 모델을 호출하고 있습니다.
Aditya MP

1
Laravel 3의 경우 실제로 DB :: last_query (); 또한 application / config / database.php에서 'profile'을 true로 설정해야합니다
Dan Smart

4
이것은 L4의 Eloquent Model에서 작동하지 않는 것 같습니다. Model :: find ($ id)를 실행하고 DB :: getQueryLog ()를 수행하면 빈 array ()가 반환됩니다. Eloquent Model에 대한 쿼리를 얻는 방법에 대한 아이디어가 있습니까?
Abishek

31

Laravel 3에서 " Profiler "를 활성화하여

'profiler' => true,

당신 application/config/application.phpapplication/config/database.php

그러면 각 페이지 하단에 막대가 활성화됩니다. 그 기능 중 하나는 실행 된 쿼리와 각 쿼리에 소요 된 시간을 나열하는 것입니다.

여기에 이미지 설명을 입력하십시오


14
Laravel 4에는 프로파일 러가 포함되어 있지 않으므로 직접 작성해야합니다 (예 : 작곡가 사용). 이 SO 질문을 참조하십시오 .
duality_

1
그것은 첫 번째 답변 에서 논의되었습니다 .
duality_

24

Eloquent의 경우 다음을 수행 할 수 있습니다.

$result->getQuery()->toSql();

그러나 쿼리에서 "-> get ()"부분을 제거해야합니다.


17

Laravel 패키지 https://github.com/itsgoingd/clockwork 와 함께 Chrome 확장 프로그램 Clockwork 를 사용하는 것이 좋습니다 . 설치 및 사용이 쉽습니다.

Clockwork는 PHP 개발을위한 Chrome 확장 프로그램으로 개발자 도구를 새로운 패널로 확장하여 요청에 대한 정보, 헤더, GET 및 POST 데이터, 쿠키, 세션 데이터, 데이터베이스 쿼리, 경로, 응용 프로그램 런타임 시각화 등 시계에는 Laravel 4 및 Slim 2 기반 응용 프로그램에 대한 기본 지원이 포함되어 있으며 확장 가능한 API를 통해 다른 또는 사용자 정의 프레임 워크에 대한 지원을 추가 할 수 있습니다.

여기에 이미지 설명을 입력하십시오


16

프로파일 러가 아직 Laravel 4나오지 않았으므로 SQL이 생성되는 것을 확인하기 위해이 도우미 함수를 만들었습니다.

    공공 정적 함수 q ($ all = true) 
    {
        $ queries = DB :: getQueryLog ();

        if ($ all == false) {
            $ last_query = 끝 ($ 쿼리);
            $ last_query를 반환;
        }

        $ 쿼리를 반환;
    }

참고 : 마지막 SQL 쿼리 만 원하는 경우 $ all 플래그를 false로 설정하십시오 .

이런 종류의 함수를 DBH.php (데이터베이스 도우미의 약자)라는 클래스에 보관하여 다음과 같은 곳에서 호출 할 수 있습니다.

dd(DBH::q()); 

내가 얻는 결과는 다음과 같습니다. 여기에 이미지 설명을 입력하십시오

궁금한 점이 있으면 dd () 형식으로 Kint를 사용합니다. http://raveren.github.io/kint/


1
if($all == false)? 간단히 말해서if(!$all)
toesslab


14

다음은 마스터 페이지 템플릿에 넣을 수있는 빠른 자바 스크립트 스 니펫입니다. 포함 된 모든 쿼리는 브라우저의 Javascript 콘솔로 출력됩니다. 쉽게 읽을 수있는 목록으로 인쇄하여 사이트를 쉽게 탐색하고 각 페이지에서 어떤 쿼리가 실행되고 있는지 확인할 수 있습니다.

디버깅이 끝나면 템플릿에서 제거하십시오.

<script type="text/javascript">
    var queries = {{ json_encode(DB::getQueryLog()) }};
    console.log('/****************************** Database Queries ******************************/');
    console.log(' ');
    queries.forEach(function(query) {
        console.log('   ' + query.time + ' | ' + query.query + ' | ' + query.bindings[0]);
    });
    console.log(' ');
    console.log('/****************************** End Queries ***********************************/');
</script>

{{json_encode ...}} 부분에서 ""가 필요하다고 생각합니다.
mydoglixu 2016 년

@mydoglixu DB::getQueryLog()배열을 반환 하므로 ""로 둘러싸 지 않아도됩니다. json_encode그에 따라 번역합니다.
rmobis 2016 년

@mobis-자바 스크립트에서 오류가 발생하지 않도록 {{...}} 외부에 ""가 필요하다는 의미입니다. 다음과 같이 : var query = "json output";
mydoglixu 2016 년

@mydoglixu JSON 배열 (또는 객체)은 유효한 JavaScript이기 때문에 그렇지 않습니다. 그렇게하면 깨질 것입니다.
rmobis

@mobis-오, 그래
mydoglixu

10

라 라벨 5

이것은 절차 적 접근 방식이며, 빠른 디버깅에 사용합니다.

    DB::enableQueryLog();

    // Run your queries
    // ...

    // Then to retrieve everything since you enabled the logging:
    $queries = DB::getQueryLog();
    foreach($queries as $i=>$query)
    {
        Log::debug("Query $i: " . json_encode($query));
    }

헤더에 다음을 사용하십시오.

     use DB;
     use Illuminate\Support\Facades\Log;

출력은 다음과 같습니다 (기본 로그 파일은 laravel.log ).

[2015-09-25 12:33:29] testing.DEBUG : 쿼리 0 : { "query": "select * from 'users'여기서 ( 'user_id'=?)", "bindings": [ "9"] , "시간": 0.23}

***이 질문에 Laravel 3/4가 지정되어 있음을 알고 있지만 일반적인 답변을 검색 할 때이 페이지가 나타납니다. Laravel의 초보자는 버전간에 차이가 있다는 것을 모를 수도 있습니다. DD::enableQueryLog()내가 일반적으로 찾은 답변에 언급 되지 않았 으므로 Laravel 5에만 해당 될 수 있습니다. 아마도 누군가 그것에 대해 언급 할 수 있습니다.


7

다음을 사용하여 쿼리 이벤트를 수신 할 수도 있습니다.

DB::listen(function($sql, $bindings, $time)
{
    var_dump($sql);
});

해당 문서의 정보를 참조하십시오 여기 에서 쿼리 이벤트를 수신


6

쿼리 로그를 사용해도 특히 바운드 값이있는 경우 실제 RAW 쿼리가 실행되지 않습니다. 이것은 원시 SQL을 얻는 가장 좋은 방법입니다.

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

또는 더 관련 :

$query = Article::whereIn('author_id', [1,2,3])->orderBy('published', 'desc')->toSql();
dd($query);

5

Laravel 5를 사용하는 경우 쿼리 전에 또는 미들웨어에이를 삽입해야합니다.

\DB::enableQueryLog();


3

Laravel 4에서는 실제로 데이터베이스 쿼리에 이벤트 리스너를 사용할 수 있습니다.

Event::listen('illuminate.query', function($sql, $bindings)
{
    foreach ($bindings as $val) {
        $sql = preg_replace('/\?/', "'{$val}'", $sql, 1);
    }

    Log::info($sql);
});

이 스 니펫을 (예 :에서) 어디에나 배치하십시오 start/global.php. 정보 로그에 쿼리를 작성합니다 ( storage/log/laravel.log).


3
Event::listen('illuminate.query', function($sql, $param)
{
    \Log::info($sql . ", with[" . join(',', $param) ."]<br>\n");
});

global.php에 넣으면 SQL 쿼리가 기록됩니다.


2

Loic Sharma SQL 프로파일 러는 Laravel 4를 지원합니다. 방금 설치했습니다. 지침 은 여기에 나열되어 있습니다 . 단계는 다음과 같습니다.

  1. "loic-sharma/profiler": "1.1.*"composer.json의 require 섹션에 추가하십시오
  2. php composer.phar self-update콘솔에서 자체 업데이트 => 를 수행하십시오 .
  3. php composer.phar update loic-sharma/profiler콘솔에서 작곡가 업데이트 => 수행
  4. 'Profiler\ProfilerServiceProvider',app.php의 공급자 배열에 추가하십시오
  5. 'Profiler' => 'Profiler\Facades\Profiler',app.php의 aliasses 배열에 추가하십시오
  6. php artisan config:publish loic-sharma/profiler콘솔에서 실행

2

마지막 검색어 인쇄

$queries = \DB::getQueryLog();
$last_query = end($queries);

// Add binding to query
foreach ($last_query['bindings'] as $val) {
        $last_query['query'] = preg_replace('/\?/', "'{$val}'", $last_query['query'], 1);
}
dd($last_query);


0

라 라벨 3

이를 수행하는 다른 방법은 다음과 같습니다.

#config/database.php

'profiler' => true

모든 쿼리 결과 :

print_r(DB::profiler());

마지막 결과 :

print_r(DB::last_query());

0

laravel에서 마지막으로 실행 된 쿼리를 얻기 위해 laravel의 DB::getQueryLog()기능을 사용하여 실행 된 모든 쿼리를 반환합니다. 마지막 쿼리를 얻기 위해 마지막 end()으로 실행 된 쿼리를 반환 하는 함수를 사용 합니다.

$student = DB::table('student')->get();
$query = DB::getQueryLog();
$lastQuery = end($query);
print_r($lastQuery);

http://www.tutsway.com/how-to-get-the-last-executed-query-in-laravel.php 에서 참조했습니다 .


귀하의 답변은 Raphael_의 승인 된 답변이 이미 다루고있는 내용에 새로운 지식을 제공하지 않는 것 같습니다.
Jaak Kütt

0

laravel 쿼리에서 열 이름을 바꾸면 쿼리에 오류가 표시됩니다 .. :)


빠른 해키 방식. 프로덕션에서는 유용하지 않지만 개발 모드에서는 유용합니다.
대신
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.