web-dev-qa-db-ja.com

Laravel 3/4でクエリを実行する

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に実行されたすべてのクエリを保存することができますか?

174
Patrick Maciel

ララヴェル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();

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

315
rmobis

設定することでLaravel 3で "Profiler"を有効にすることができます。

'profiler' => true,

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

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

enter image description here

30
dualed

Eloquentの場合は、次のようにします。

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

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

24
JamesPlayer

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

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

enter image description here

17
Znarkus

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

 
パブリック静的関数q($ all = true)
 {
 $ query = DB :: getQueryLog(); 
 
 ] if($ all == false){
 $ last_query = end($ query); 
 return $ last_query; 
} 
 
 return $クエリ; 
} 
 

NOTE$ allフラグをfalseに設定します最後のSQLクエリだけが必要な場合。

私はこの種の関数をDBH.php(Database Helperの略)と呼ばれるクラスに保持しているので、このようにどこからでも呼び出すことができます。

dd(DBH::q()); 

これが私が得る出力です: enter image description here

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

16
Ricardo Rossi

Laravel 4では

DB::getQueryLog()
14
misaizdaleka

これがあなたのマスターページテンプレートに投げることができる簡単な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>
14
Adam

ララヴェル5

これはproceduralアプローチであることに注意してください。私はこれをクイックデバッグに使用します。

    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:{"クエリ": "( 'user_id' =?)"から "*を選択"、 "バインディング":["9"] 、 "時間":0.23}

***私はこの質問がLaravel 3/4を指定しているのを知っていますが、このページは一般的な答えを探すときに現れます。 Laravelの初心者は、バージョン間に違いがあることを知らないかもしれません。 DD::enableQueryLog()が普段見ている答えのどれにも言及されていないので、それはmay Laravel 5に固有のものである - おそらく誰かがそれについてコメントすることができます。

10
Bryan

これを使ってクエリイベントを監視することもできます。

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

ドキュメントの情報を参照してください。 こちらクエリイベントを聞く

7
SnapShot

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

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

もっと関係している:

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

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

\DB::enableQueryLog();
4
Mandeep Gill

あるいは、laravel 3プロファイラーの代わりに次のものを使用できます。

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

4
karelv

Laravel 4では、データベースクエリにEvent Listenerを実際に使用できます。

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
aebersold
Event::listen('illuminate.query', function($sql, $param)
{
    \Log::info($sql . ", with[" . join(',', $param) ."]<br>\n");
});

global.phpに入れると、SQLクエリがログに記録されます。

3
Christland

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

  1. Composer.jsonのrequireセクションに"loic-sharma/profiler": "1.1.*"を追加します。
  2. コンソールでself-update => php composer.phar self-updateを実行してください。
  3. コンソールで作曲家update => php composer.phar update loic-sharma/profilerを実行する
  4. App.phpのプロバイダ配列に'Profiler\ProfilerServiceProvider',を追加します
  5. App.phpのaliasses配列に'Profiler' => 'Profiler\Facades\Profiler',を追加する
  6. コンソールでphp artisan config:publish loic-sharma/profilerを実行します
2
bicycle

最後のクエリの印刷

$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);
2

L4ワンライナー

(クエリを書く):

$q=\DB::getQueryLog();dd(end($q));

1

それを行うのは非常に簡単な方法があります、あなたのlaravelクエリからちょうど任意のカラム名を変更してください、それはあなたのクエリでエラーを表示します.. :)

0
Aamir

ララベル3

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

#config/database.php

'profiler' => true

すべてのクエリについて結果:

print_r(DB::profiler());

最後の結果の場合:

print_r(DB::last_query());
0
Wallace Maxters

最後に実行されたクエリを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 から参照を取りました。

0
Manish