如何利用預加載優(yōu)化Laravel Model查詢詳解
前言
本文主要給大家介紹了關于利用預加載優(yōu)化Laravel Model查詢的相關內(nèi)容,分享出來供大家參考學習,話不多說了,來一起看看詳細的介紹:
介紹
對象關系映射(ORM)使數(shù)據(jù)庫的工作變得非常簡單。 在以面向?qū)ο蟮姆绞蕉x數(shù)據(jù)庫關系時,可以輕松查詢相關的模型數(shù)據(jù),開發(fā)人員可能不會注意底層數(shù)據(jù)庫調(diào)用。
下面將通過一些例子,進一步幫助您了解如何優(yōu)化查詢。
假設您從數(shù)據(jù)庫收到了100個對象,并且每個記錄都有1個關聯(lián)模型(即belongsTo)。 默認使用ORM將產(chǎn)生101個查詢; 如下所示:
//獲取已發(fā)布的100條文章
$posts = Post::limit(100)->get(); //一次查詢
$authors = array_map(function($post) {
// 對作者模型生成查詢
return $post->author->name;
}, $posts);
我們在查詢時沒有告訴Post模型,我們還需要所有的作者,所以每次從單個Post模型實例獲取作者的名字時,都會發(fā)生單獨的查詢。
array_maps時發(fā)生100次查詢,加上先前一次查詢,累計產(chǎn)生101次查詢。
預加載
接下來,如果我們打算使用關聯(lián)的模型數(shù)據(jù),我們可以使用預加載將該101個查詢總數(shù)減少到2個查詢。 只需要告訴模型你需要什么來加載。如下:
//獲取已發(fā)布的100條文章 - 并預加載文章對應作者
$posts = Post::with('author')->limit(100)->get();//2次查詢
$authors = array_map(function($post) {
// 對作者模型生成查詢
return $post->author->name;//這里講不在產(chǎn)生查詢
}, $posts);
如果你開啟了sql日志,你將看到上述預加載將只會產(chǎn)生兩條查詢:
select * from `posts` select * from `authors` where `authors`.`id` in (?, ?, ?, ?, ?) [1,2,3,4,5]
如果您有多個關聯(lián)模型,則可以使用數(shù)組加載它們:
$posts = App\Post::with(['author', 'comments'])->get();
接下來我們重新定義如下關系
Post -> belongsTo -> Author //每個文章只屬于一個用戶 Author -> hasMany -> Post //每個用戶擁有多個文章 Author -> hasOne -> Profile //每個用戶只有一個簡介
考慮下述情況:獲取已發(fā)布文章所屬作者的個人簡介。
//獲取所有文章 - 并預加載文章對應作者
$posts = App\Post::with('author')->get();//兩次查詢
//根據(jù)每個 `作者` 獲取其簡介
$posts->map(function ($post) {
//雖然我們直接通過$author = $post->author不會產(chǎn)生查詢,
//但當調(diào)用$author->profile時,每次都會產(chǎn)生一個新查詢
return $post->author->profile;
});
假設上述App\Post::with('author')->get()有100條記錄,將會產(chǎn)生多少條查詢呢?
通過優(yōu)化預加載,我們可以避免嵌套關系中的額外查詢。
//獲取所有文章 - 并預加載文章對應作者及每個作者對應de profile
$posts = App\Post::with('author.profile')->get();//三次查詢
$posts->map(function ($post) {
//不在產(chǎn)生新查詢
return $post->author->profile;
});
你可以打開你的sql日志看到對應的三條查詢。
select * from `posts` select * from `authors` where `authors`.`id` in (?, ?, ?, ?, ?) [.....] select * from `profiles` where `profiles`.`author_id` in (?, ?, ?, ?, ?) [.....]
懶惰加載
有時候您可能只需要根據(jù)條件收集相關聯(lián)的模型。 在這種情況下,您可以懶惰地調(diào)用相關數(shù)據(jù)的其他查詢:
$posts = App\Post::all();//一次查詢
$posts->load('author.profile');//兩次查詢
$posts->map(function ($post) {
//不在產(chǎn)生新查詢
return $post->author->profile;
});
查看您的sql日志,總共看到三個查詢,但只有調(diào)用$posts->load()時才會顯示。
結(jié)論
希望您更加了解有關加載型號的更多信息,并了解其在更深層次上的工作原理。 Laravel相關的文檔已經(jīng)很全面了,希望額外的實踐練習可以幫助您更有信心優(yōu)化關系查詢。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
原文譯自eloquent-eager-loading,簡化其前面構(gòu)造數(shù)據(jù)部分。
- 淺談laravel中的關聯(lián)查詢with的問題
- PHP中Laravel 關聯(lián)查詢返回錯誤id的解決方法
- laravel orm 關聯(lián)條件查詢代碼
- laravel學習教程之關聯(lián)模型
- Laravel關聯(lián)模型中過濾結(jié)果為空的結(jié)果集(has和with區(qū)別)
- laravel withCount 統(tǒng)計關聯(lián)數(shù)量的方法
- laravel ORM關聯(lián)關系中的 with和whereHas用法
- Laravel 模型關聯(lián)基礎教程詳解
- Laravel 關聯(lián)模型-關聯(lián)新增和關聯(lián)更新的方法
- laravel 關聯(lián)關系遍歷數(shù)組的例子
- Laravel5中實現(xiàn)模糊匹配加多條件查詢功能的方法
- laravel 框架結(jié)合關聯(lián)查詢 when()用法分析
相關文章
php通過PHPExcel導入Excel表格到MySQL數(shù)據(jù)庫的簡單實例
下面小編就為大家?guī)硪黄猵hp通過PHPExcel導入Excel表格到MySQL數(shù)據(jù)庫的簡單實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-10-10
基于php解決json_encode中文UNICODE轉(zhuǎn)碼問題
這篇文章主要介紹了基于php解決json_encode中文UNICODE轉(zhuǎn)碼問題,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-11-11
php實現(xiàn) master-worker 守護多進程模式的實例代碼
這篇文章主要介紹了php實現(xiàn) master-worker 守護多進程模式的實例代碼,代碼簡單易懂,非常不錯,具有一定的參考借鑒價值 ,需要的朋友可以參考下2019-07-07
PHP實現(xiàn)用session來實現(xiàn)記錄用戶登陸信息
在本篇文章里我們給大家分享了關于PHP如何用session來實現(xiàn)記錄用戶登陸信息的知識點,有興趣的朋友們參考下。2018-10-10
thinkPHP數(shù)據(jù)庫增刪改查操作方法實例詳解
這篇文章主要介紹了thinkPHP數(shù)據(jù)庫增刪改查操作方法,結(jié)合實例形式詳細分析了thinkPHP常用數(shù)據(jù)庫操作函數(shù)與相關使用技巧,需要的朋友可以參考下2016-12-12

