ラーラベルにおけるN+1問題

5115 ワード

ep26@Laracasts時計回りとN + 1問題
このポストはシリーズの一部です.
ブログ一覧にもどるBlog Project , 我々はN ブログ柱と舞台裏N+1 クエリは、それらの投稿とそのカテゴリを取得します.最初のクエリはポストを取得し、残りは各ポストに対してカテゴリを取得します.

それは私たちのposts.blade.php 私たちはすべてのポストを通してループし、各ポストごとに次のようにカテゴリにアクセスします.
<p>
<a href="/categories/{{ $post->category->slug }}">
{{ $post->category->title }}
</a>
</p>
しかし、我々のルート定義で、我々はポストだけを引っ張りました、そして、彼らを以下の通りにしてください
Route::get('/', function () {
    return view('posts', [
        'posts' => Post::all()
    ]);
});
Lavavelのデザイン、怠惰ロードポスト.なぜ、どこで参照されていないのか、関係をロードすべきです.それは意味をなすが、それから我々はN+1 トラップ.
解決策は、私たちの投稿をロードする方法を変更することです.lazyloadingの代わりに、我々は熱心に我々のポストをロードします.現在使用中Post::all() を返します.我々はそれを変更するPost::with("category")
Route::get('/', function () {    
    return view('posts', [
        'posts' => Post::with("category")->get();
    ]);
});
現在、2つの質問だけが実行されます、すべてのポストをフェッチするための1、そして、それらの記事のために関係を取り戻すための2番目.

デバッグするN+1 問題は、ララベルを使用することができますLog ファサードlogger() を使用してデータベースクエリをログ出力するDB ファサード.ブログ一覧ページのルート定義で、N+1 問題
Route::get('/', function () {
    Illuminate\Support\Facades\DB::listen(function($query) {
        logger($query->sql, $query->bindings);
    });

    return view('posts', [
        'posts' => Post::all()
    ]);
});
この問題を簡単にデバッグするもう一つのツールはClockwork Laravelパッケージとコンパニオンクローム/Firefox拡張.Composerパッケージとブラウザの拡張機能をインストールすると、今すぐあなたのブログのページを参照してくださいClockwork .

このエピソードでブログプロジェクトに行われたすべての変更を見るにはEp#26: Clockwork, and the N+1 Problem
.