ホームページ >バックエンド開発 >PHPチュートリアル >Laravel がプリロードを通じてモデルクエリを最適化する方法の詳細な説明
この記事では主に、プリロードを使用して Laravel モデルのクエリを最適化する方法に関する関連情報をサンプル コードを通じて詳しく紹介します。この記事は、学習や作業に必要な学習に役立ちます。以下の編集者と一緒に学びましょう。お役に立てれば幸いです。
前書き
この記事では主に、Laravel モデルのクエリを最適化するためのプリロードの使用に関する関連コンテンツを紹介し、参照と学習のために共有します。
はじめに
以下では、クエリを最適化する方法をさらに理解するためにいくつかの例を使用します。
データベースから 100 個のオブジェクトを受け取り、各レコードに 1 つの関連付けられたモデル (つまり、belongsTo) があるとします。 デフォルトで ORM を使用すると、以下に示すように 101 個のクエリが生成されます://获取已发布的100条文章 $posts = Post::limit(100)->get(); //一次查询 $authors = array_map(function($post) { // 对作者模型生成查询 return $post->author->name; }, $posts);クエリ時にすべての著者も必要であることを Post モデルに伝えていないため、著者の名前をデータから取得するたびに別のクエリが発生します。単一の Post モデル インスタンスの問い合わせ。 array_maps 100 個のクエリが発生し、前のクエリを加えて、合計 101 個のクエリが生成されました。
プリロード
//获取已发布的100条文章 - 并预加载文章对应作者 $posts = Post::with('author')->limit(100)->get();//2次查询 $authors = array_map(function($post) { // 对作者模型生成查询 return $post->author->name;//这里讲不在产生查询 }, $posts);SQL ログを有効にすると、上記のプリロードで 2 つのクエリのみが生成されることがわかります:
select * from `posts` select * from `authors` where `authors`.`id` in (?, ?, ?, ?, ?) [1,2,3,4,5]関連するモデルが複数ある場合は、配列を使用してそれらをロードできます:
$posts = App\Post::with(['author', 'comments'])->get();次は再定義します次の関係
Post -> belongsTo -> Author //每个文章只属于一个用户 Author -> hasMany -> Post //每个用户拥有多个文章 Author -> hasOne -> Profile //每个用户只有一个简介次の状況を考えてみましょう: 公開された記事の著者の個人プロフィールを取得します。
//获取所有文章 - 并预加载文章对应作者 $posts = App\Post::with('author')->get();//两次查询 //根据每个 `作者` 获取其简介 $posts->map(function ($post) { //虽然我们直接通过$author = $post->author不会产生查询, //但当调用$author->profile时,每次都会产生一个新查询 return $post->author->profile; });上記の
に 100 件のレコードがあると仮定すると、いくつのクエリが生成されるでしょうか? AppPost::with('author')->get()
//获取所有文章 - 并预加载文章对应作者及每个作者对应de profile $posts = App\Post::with('author.profile')->get();//三次查询 $posts->map(function ($post) { //不在产生新查询 return $post->author->profile; });SQL ログを開いて、対応する 3 つのクエリを確認できます。
select * from `posts` select * from `authors` where `authors`.`id` in (?, ?, ?, ?, ?) [.....] select * from `profiles` where `profiles`.`author_id` in (?, ?, ?, ?, ?) [.....]
遅延読み込み
$posts = App\Post::all();//一次查询 $posts->load('author.profile');//两次查询 $posts->map(function ($post) { //不在产生新查询 return $post->author->profile; });SQL ログを見ると、合計 3 つのクエリが表示されますが、それらは $posts->load() が呼び出された場合にのみ表示されます。
結論
概要
原文は eloquent-eager-loading から翻訳されており、データ構築の前の部分が簡略化されています。関連する推奨事項:
Laravelの非同期処理を実行するスーパーバイザーの実装方法の詳細な説明
Laravelのタスクスケジューリングコンソールの詳細な説明
以上がLaravel がプリロードを通じてモデルクエリを最適化する方法の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。