2016-05-12 4 views
2

多くの関係があり、多くのクエリを実行するとサイトが遅くなるため問題になっています。Laravel - ブレードビューで繰返しクエリを実行する - クエリ数を減らす

たとえば、私はすべてのブログに対してforeachループを実行しており、ブログを作成したユーザーを取得しています。

それだけでは50以上のクエリです。もし100個のブログがあれば、クエリの数は途方もなくです。

どうすればこの問題を回避できますか?このビューで変数に変数を格納しましたが、実際にはPHPコードをブレードファイルに入れたくありません。これを避けるにはどうすればいいですか?私はデータベース内のキャッシュを使用しようとしましたが、データベース内のキャッシュテーブルに対していくつかのクエリを実行しています。私もたくさんの助けになった熱心なローディングを使用しています。しかし、私はこの種のことを最善にするにはどうしたらよいですか?

お返事ありがとうございます。

+0

。単一のSQL問合せでは、達成しようとしているものと同じ処理が実行されます。 – TheDrot

+1

@TheDrot、あなたはちょうどそれがどのように動作するかを知る必要があります。 ORMを使用すると、管理しやすく読みやすいコードが得られます。数多くのジョインは見た目が醜く、App \ Book :: with( 'author'、 'publisher') - > get();・ –

+0

@AlexeyMezenin彼らはどのように動作するのですか?あなたのサンプルは3つのクエリを実行し、クエリのカウントは、アプリケーションを使用する多くのユーザーに問題になる可能性のあるすべての追加のリレーションで上がります。何十もの結合が醜いかもしれませんが、今日のバックエンドのWeb開発者は、データベースとSQLについていくつかの知識が必要だと思います。 – TheDrot

答えて

4

これはN + 1問題と呼ばれます。 Eager loadingを使用し、関係を最初にロードする方法を学ぶ必要があります。次に、コレクションを反復処理して、ユーザーにデータを表示します。

ドキュメントから複数の関係の積極的なロードの例:@Achraf Khouadjaによって提案された

$books = App\Book::with('author', 'publisher')->get(); 

例とtutorial

私はオームズから離れて滞在しようとする理由です
$blogs = blog::with('lastCommenter', 'user')->get(); 
+0

@AchrafKhouadja、すみません? –

+1

あなたのコメントは彼のためのものですllolこれはawkawrd、間違った場所です、あなたは良かった –

関連する問題