久久久久久久av_日韩在线中文_看一级毛片视频_日本精品二区_成人深夜福利视频_武道仙尊动漫在线观看

如何利用預加載優化Laravel Model查詢詳解

這篇文章主要給大家介紹了關于如何利用預加載優化Laravel Model查詢的相關資料,文章通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面

前言

本文主要給大家介紹了關于利用預加載優化Laravel Model查詢的相關內容,分享出來供大家參考學習,話不多說了,來一起看看詳細的介紹:

介紹

對象關系映射(ORM)使數據庫的工作變得非常簡單。 在以面向對象的方式定義數據庫關系時,可以輕松查詢相關的模型數據,開發人員可能不會注意底層數據庫調用。

下面將通過一些例子,進一步幫助您了解如何優化查詢。

假設您從數據庫收到了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次查詢。

預加載

接下來,如果我們打算使用關聯的模型數據,我們可以使用預加載將該101個查詢總數減少到2個查詢。 只需要告訴模型你需要什么來加載。如下:

//獲取已發布的100條文章 - 并預加載文章對應作者
$posts = Post::with('author')->limit(100)->get();//2次查詢

$authors = array_map(function($post) {
 // 對作者模型生成查詢
 return $post->author->name;//這里講不在產生查詢
}, $posts);

如果你開啟了sql日志,你將看到上述預加載將只會產生兩條查詢:

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;
});

假設上述App\Post::with('author')->get()有100條記錄,將會產生多少條查詢呢?

通過優化預加載,我們可以避免嵌套關系中的額外查詢。

//獲取所有文章 - 并預加載文章對應作者及每個作者對應de profile
$posts = App\Post::with('author.profile')->get();//三次查詢

$posts->map(function ($post) {
 //不在產生新查詢
 return $post->author->profile;
});

你可以打開你的sql日志看到對應的三條查詢。

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日志,總共看到三個查詢,但只有調用$posts->load()時才會顯示。

結論

希望您更加了解有關加載型號的更多信息,并了解其在更深層次上的工作原理。 Laravel相關的文檔已經很全面了,希望額外的實踐練習可以幫助您更有信心優化關系查詢。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對的支持。

原文譯自eloquent-eager-loading,簡化其前面構造數據部分。

【網站聲明】本站除付費源碼經過測試外,其他素材未做測試,不保證完整性,網站上部分源碼僅限學習交流,請勿用于商業用途。如損害你的權益請聯系客服QQ:2655101040 給予處理,謝謝支持。

相關文檔推薦

下面小編就為大家分享一篇laravel ORM 只開啟created_at的幾種方法總結,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
這篇文章主要給大家介紹了如何通過源碼解析Laravel的依賴注入的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著
這篇文章主要給大家介紹了關于Laravel中unique和exists驗證規則的優化的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面
最近在使用laravel5.5,利用其實現了一個功能,下面分享給大家,這篇文章主要給大家介紹了關于Laravel 5.5基于內置的Auth模塊如何實現前后臺登陸的相關資料,文中通過示例代碼介紹的非
laravel 的隊列服務對各種不同的后臺隊列服務提供了統一的 API,下面這篇文章通過源碼分析給大家介紹了關于 Laravel 重復執行同一個隊列任務的原因,文中通過示例代碼介紹的非常詳細
這篇文章主要給大家介紹了關于 Laravel Redis 多個進程同時取隊列問題的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或工作具有一定的參考學習價值,需要的朋友下面來
主站蜘蛛池模板: 看特级黄色片 | 天天射网站 | 在线播放国产一区二区三区 | 亚洲视频免费在线看 | 日韩国产中文字幕 | 二区中文 | 国产亚洲精品久久yy50 | 福利视频日韩 | 一区二区三区高清不卡 | 992tv人人草 久久精品超碰 | 亚洲精品在线观看视频 | 欧美日韩福利 | 韩国av网站在线观看 | 久久久久国产一区二区三区四区 | 麻豆亚洲 | 欧美日韩高清免费 | 特级做a爱片免费69 精品国产鲁一鲁一区二区张丽 | 久久亚洲91| www.亚洲一区 | 四虎最新视频 | 久久国色| 97国产在线视频 | 91精品国产日韩91久久久久久 | 午夜天堂精品久久久久 | 亚洲最大av| 精品九九九| 国产精品久久久久久久久久久免费看 | 亚洲成人天堂 | 精品久 | 国产精品久久久久久妇女 | 日韩欧美国产一区二区 | 妹子干综合 | 国产精品中文字幕在线播放 | 久久综合一区 | 久久久精品国产 | 最近免费日本视频在线 | 亚洲精品久久久一区二区三区 | 国内自拍视频在线观看 | 成人精品一区亚洲午夜久久久 | 激情五月婷婷 | 久久久久国产一级毛片高清网站 |