Laravel 3/4で実行されたクエリを取得する


182

Laravelクエリビルダーまたは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、in application/config/application.phpまたはcallのオプションを有効にすることもできますDB::profile()


2
Laravel 4のコードが機能しません。私はこれを受け取りますErrorException:警告:call_user_func_array()パラメータ1は有効なコールバックであると想定Illuminate\Database\MySqlConnectionしています。クラスにはメソッドがありませんgetQueryList
duality_ 2013年

私の悪い、正しい方法はgetQueryLogです。今それを修正しました。ありがとう!
rmobis

奇妙なことに... Queryオブジェクトのエラーでlast_query()が定義されていません。私は、インスタンス化されていないEloquentモデルを要求しています。
Aditya MP

1
Laravel 3の場合、実際にはDB :: last_query();です。また、application / config / database.phpで 'profile'をtrueに設定する必要があります
Dan Smart

4
これはL4のEloquentモデルでは機能しないようです。Model :: find($ id)を実行してDB :: getQueryLog()を実行すると、空のarray()が返されます。Eloquentモデルのクエリを取得する方法はありますか?
アビシェク2013年

31

Laravel 3で「プロファイラ」を有効にするには、

'profiler' => true,

あなたapplication/config/application.phpapplication/config/database.php

これにより、各ページの下部にバーが表示されます。その機能の1つは、実行されたクエリの一覧と、それぞれのクエリにかかった時間です。

ここに画像の説明を入力してください


14
Laravel 4にはプロファイラーは含まれていません。自分でインストールする必要があります(例:composerを使用)。このSOの質問を参照してください。
duality_ 2013年

1
それはそこで最初の答えで議論されてます。
duality_ 2014

24

Eloquentの場合は、次のようにすることができます。

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

ただし、クエリから "-> get()"の部分を削除する必要があります。


17

Laravelパッケージhttps://github.com/itsgoingd/clockworkでChrome拡張機能Clockworkを使用することをお勧めします。インストールと使用は簡単です。

ClockworkはPHP開発用のChrome拡張機能であり、開発者ツールを新しいパネルで拡張し、リクエスト、ヘッダー、GETおよびPOSTデータ、Cookie、セッションデータ、データベースクエリに関する情報など、PHPスクリプトのデバッグとプロファイリングに役立つあらゆる種類の情報を提供します。ルート、アプリケーションランタイムの視覚化など。Clockworkには、Laravel 4およびSlim 2ベースのアプリケーションの追加設定なしのサポートが含まれています。拡張可能なAPIを介して、他のフレームワークまたはカスタムフレームワークのサポートを追加できます。

ここに画像の説明を入力してください


16

Laravel 4ではプロファイラーがまだ出ていないので、SQLが生成されるのを確認するためにこのヘルパー関数を作成しました。

    パブリック静的関数q($ all = true) 
    {
        $ queries = DB :: getQueryLog();

        if($ all == false){
            $ last_query = end($ queries);
            $ last_queryを返します。
        }

        $クエリを返す;
    }

:最後のSQLクエリのみが必要な場合は、$ allフラグをfalseに設定します。

この種の関数はDBH.php(データベースヘルパーの略)と呼ばれるクラスに保持しているため、次のような場所から呼び出すことができます。

dd(DBH::q()); 

これが私が得る出力です: ここに画像の説明を入力してください

ご参考までに、dd()のフォーマットにはKintを使用しています。 http://raveren.github.io/kint/


1
if($all == false)?なぜ単純ではないのかif(!$all)
toesslab 2016


14

これは、マスターページテンプレートにスローできる簡単なJavaScriptスニペットです。含まれている限り、すべてのクエリはブラウザの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

@mydoglixu DB::getQueryLog()は配列を返すので、 ""で囲む必要はありません。json_encodeそれに応じて翻訳します。
rmobis 2015年

@mobis-JavaScriptがエラーをスローしないように、{{...}}の外側に ""が必要であることを意味しました。このように:var query = "json output";
mydoglixu

@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' where( '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コンソールでもcomposer update =>を実行します `
  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で最後に実行されたクエリを取得するには、実行されたDB::getQueryLog()すべてのクエリを返すlaravelの関数を使用します。最後のクエリを取得するには、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_が承認した回答がすでにカバーしている内容に新しい知識をもたらすものではないようです。
JaakKütt15年

0

これを行うには非常に簡単な方法があります。laravelクエリから列名を変更するだけで、クエリにエラーが表示されます。


迅速なハック方法。本番環境では役に立ちませんが、開発モードでは、場合によっては問題ありません。
代わりに
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.