ラーラベルにおけるN+1問題
5115 ワード
ep26@Laracasts時計回りとN + 1問題
このポストはシリーズの一部です.
ブログ一覧にもどるBlog Project , 我々は
それは私たちの
解決策は、私たちの投稿をロードする方法を変更することです.lazyloadingの代わりに、我々は熱心に我々のポストをロードします.現在使用中
デバッグする
このエピソードでブログプロジェクトに行われたすべての変更を見るにはEp#26: Clockwork, and the N+1 Problem
.
このポストはシリーズの一部です.
ブログ一覧にもどる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
.
Reference
この問題について(ラーラベルにおけるN+1問題), 我々は、より多くの情報をここで見つけました https://dev.to/arifiqbal/the-n1-problem-in-laravel-3g4nテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol