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