中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么利用預加載優化Laravel Model查詢

發布時間:2021-02-04 10:29:12 來源:億速云 閱讀:114 作者:小新 欄目:開發技術

這篇文章主要介紹了怎么利用預加載優化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 Model查詢”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

顺昌县| 故城县| 会昌县| 海兴县| 淮北市| 河北省| 鲁甸县| 南乐县| 和田县| 克拉玛依市| 渭南市| 涿州市| 密山市| 大荔县| 互助| 湖州市| 神木县| 新绛县| 仙游县| 电白县| 玛多县| 陇南市| 秦安县| 石阡县| 万盛区| 嘉祥县| 上蔡县| 土默特右旗| 浮山县| 延寿县| 丰县| 故城县| 武山县| 商南县| 响水县| 阿克| 阳江市| 寿阳县| 同心县| 五家渠市| 五河县|