187

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に保存するにはどうすればよいですか?

4

21 に答える 21

320

ララベル 4+

Laravel 5 ユーザーへの注意:DB::enableQueryLog()クエリを実行する前に呼び出す必要があります。クエリを実行する行のすぐ上またはミドルウェア内のいずれか。

Laravel 4 以降では、実行されDB::getQueryLog()たすべてのクエリを取得するために呼び出す必要があります。

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

または、プロファイラー パッケージをダウンロードできます。とてもきれいなbarryvdh/laravel-debugbarをお勧めします。リポジトリにインストールする方法については、こちらを参照してください。


ララベル3

Laravel 3 では、クラスEloquentの静的メソッドを呼び出すモデルから最後に実行されたクエリを取得できます。last_queryDB

DB::last_query();

profilerただし、これには でオプションを有効にする必要がありますapplication/config/database.php。または、@dualed が述べたように、profilerオプションを有効にするか、現在のリクエストで実行されたすべてのクエリとその実行時間を取得するためにapplication/config/application.php呼び出すこともできます。DB::profile()

于 2013-01-26T10:50:13.623 に答える
31

設定することにより、Laravel 3で「プロファイラー」を有効にすることができます

'profiler' => true,

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

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

ここに画像の説明を入力

于 2013-01-26T10:45:32.483 に答える
26

Eloquentの場合、次のことができます:

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

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

于 2014-07-25T04:32:20.910 に答える
19

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

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

ここに画像の説明を入力

于 2014-07-29T09:17:49.320 に答える
16

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

    public static function q($all = true)
    {
        $queries = DB::getQueryLog();

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

        $クエリを返します。
    }

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

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

dd(DBH::q()); 

これが私が得る出力です: ここに画像の説明を入力

ご参考までに、私は dd() の書式設定に Kint を使用しています。 http://raveren.github.io/kint/

于 2013-06-14T10:54:34.323 に答える
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>
于 2013-09-30T02:09:30.290 に答える
14

Laraver 4の場合は

DB::getQueryLog()
于 2013-03-18T16:18:45.260 に答える
11

ララベル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に固有のものである可能性があります-おそらく誰かがそれについてコメントできます。

于 2015-09-25T12:53:50.117 に答える
7

これを使用してクエリ イベントをリッスンすることもできます。

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

クエリ イベントのリッスンの下にあるドキュメントの情報を参照してください

于 2014-06-20T13:25:40.633 に答える
6

クエリ ログを使用しても、特にバインドされた値がある場合、実行されている実際の RAW クエリは得られません。これは、生の SQL を取得するための最良の方法です。

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

またはそれ以上の関与:

$query = Article::whereIn('author_id', [1,2,3])->orderBy('published', 'desc')->toSql();
dd($query);
于 2014-10-29T17:00:12.657 に答える
5

Laravel 5 を使用している場合は、これをクエリの前またはミドルウェアに挿入する必要があります。

\DB::enableQueryLog();
于 2016-01-27T13:05:54.473 に答える
4

または、laravel 3 プロファイラーの代わりに以下を使用できます。

https://github.com/paulboco/profiler または https://github.com/barryvdh/laravel-debugbar

于 2013-11-10T16:13:15.020 に答える
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)。

于 2014-08-07T13:02:28.020 に答える
2

Loic Sharma SQL プロファイラーは Laravel 4 をサポートしています。インストールしたばかりです。手順はこちらに記載されています。手順は次のとおりです。

  1. "loic-sharma/profiler": "1.1.*"composer.json の require セクションに追加 します。
  2. php composer.phar self-updateコンソールで自己更新 => を実行します。
  3. composer update =>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コンソールで実行
于 2014-05-28T00:26:27.740 に答える
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);
于 2015-02-13T04:50:57.677 に答える
0

ララベル3

これを行う別の方法は次のとおりです。

#config/database.php

'profiler' => true

すべてのクエリの結果:

print_r(DB::profiler());

最後の結果:

print_r(DB::last_query());
于 2015-03-24T11:45:56.280 に答える
0

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

于 2016-11-26T06:57:44.140 に答える