怎么利用預(yù)加載優(yōu)化LaravelModel查詢-創(chuàng)新互聯(lián)

這篇文章主要介紹了怎么利用預(yù)加載優(yōu)化Laravel Model查詢,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

目前創(chuàng)新互聯(lián)已為上千多家的企業(yè)提供了網(wǎng)站建設(shè)、域名、雅安服務(wù)器托管網(wǎng)站托管、企業(yè)網(wǎng)站設(shè)計(jì)、環(huán)江網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長(zhǎng),共同發(fā)展。

介紹


對(duì)象關(guān)系映射(ORM)使數(shù)據(jù)庫的工作變得非常簡(jiǎn)單。 在以面向?qū)ο蟮姆绞蕉x數(shù)據(jù)庫關(guān)系時(shí),可以輕松查詢相關(guān)的模型數(shù)據(jù),開發(fā)人員可能不會(huì)注意底層數(shù)據(jù)庫調(diào)用。

下面將通過一些例子,進(jìn)一步幫助您了解如何優(yōu)化查詢。

假設(shè)您從數(shù)據(jù)庫收到了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í)沒有告訴Post模型,我們還需要所有的作者,所以每次從單個(gè)Post模型實(shí)例獲取作者的名字時(shí),都會(huì)發(fā)生單獨(dú)的查詢。

array_maps時(shí)發(fā)生100次查詢,加上先前一次查詢,累計(jì)產(chǎn)生101次查詢。


預(yù)加載


接下來,如果我們打算使用關(guān)聯(lián)的模型數(shù)據(jù),我們可以使用預(yù)加載將該101個(gè)查詢總數(shù)減少到2個(gè)查詢。 只需要告訴模型你需要什么來加載。如下:

//獲取已發(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);

如果你開啟了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();

接下來我們重新定義如下關(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) {
 //雖然我們直接通過$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)生多少條查詢呢?


通過優(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;
});

你可以打開你的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ì)顯示。

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“怎么利用預(yù)加載優(yōu)化Laravel Model查詢”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持創(chuàng)新互聯(lián)網(wǎng)站建設(shè)公司,,關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來學(xué)習(xí)!

文章題目:怎么利用預(yù)加載優(yōu)化LaravelModel查詢-創(chuàng)新互聯(lián)
分享URL:http://muchs.cn/article46/dddchg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供靜態(tài)網(wǎng)站、網(wǎng)站策劃、面包屑導(dǎo)航、定制開發(fā)、移動(dòng)網(wǎng)站建設(shè)、ChatGPT

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站建設(shè)網(wǎng)站維護(hù)公司