使用預載入優化Laravel Model查詢

2021-09-16 18:39:22 字數 2076 閱讀 1942

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

物件關係對映(orm)使資料庫的工作變得非常簡單。 在以物件導向的方式定義資料庫關係時,可以輕鬆查詢相關的模型資料,開發人員可能不會注意底層資料庫呼叫。

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

假設您從資料庫收到了100個物件,並且每個記錄都有1個關聯模型(即belongsto)。 預設使用orm將產生101個查詢; 如下所示:

//獲取已發布的100條文章

$posts = post::limit(100)->get(); //一次查詢

$authors = array_map(function($post) , $posts);

我們在查詢時沒有告訴post模型,我們還需要所有的作者,所以每次從單個post模型例項獲取作者的名字時,都會發生單獨的查詢。

array_maps時發生100次查詢,加上先前一次查詢,累計產生101次查詢。

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

//獲取已發布的100條文章  - 並預載入文章對應作者

$posts = post::with('author')->limit(100)->get();//2次查詢

$authors = array_map(function($post) , $posts);

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

select * from `posts`

select * from `authors` where `authors`.`id` in (?, ?, ?, ?, ?) [1,2,3,4,5]

如果您有多個關聯模型,則可以使用陣列載入它們:

接下來我們重新定義如下關係

post -> belongsto -> author //每個文章只屬於乙個使用者

author -> hasmany -> post //每個使用者擁有多個文章

author -> hasone -> profile //每個使用者只有乙個簡介

//獲取所有文章 - 並預載入文章對應作者

//根據每個 `作者` 獲取其簡介

$posts->map(function ($post) );

通過優化預載入,我們可以避免巢狀關係中的額外查詢。

//獲取所有文章 - 並預載入文章對應作者及每個作者對應de profile

$posts->map(function ($post) );

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

select * from `posts`  

select * from `authors` where `authors`.`id` in (?, ?, ?, ?, ?) [.....]

select * from `profiles` where `profiles`.`author_id` in (?, ?, ?, ?, ?) [.....]

$posts->load('author.profile');//兩次查詢

$posts->map(function ($post) );

檢視您的sql日誌,總共看到三個查詢,但只有呼叫$posts->load()時才會顯示。

ViewPager預載入及其優化

前言 以前用viewpager做輪播圖,左右滑動感覺挺流程,沒感覺有卡頓的現象 但實現現在又用viewpager做日曆,日曆的模組全部是用canvas畫出來的,在這裡有一些演算法要去處理,viewpager左右滑動好像沒那麼流暢了。這個時候我就在想如何優化viewpager,盡量讓它左右滑動的時候不...

前端優化 檔案預載入

xhr和動態插入節點 使用動態插入節點方法載入的檔案都會在載入後立即執行。ie中使用 new image src 去預載入檔案,而其他瀏覽器使用動態插入的 標籤來完成載入。window.onload function o document.createelement object o.data pr...

前端效能優化 預載入

1.什麼是預載入 資源預載入是另乙個效能優化技術,我們可以使用該技術來預先告知瀏覽器某些資源可能在將來會被使用到。預載入簡單來說就是將所有所需的資源提前請求載入到本地,這樣後面在需要用到時就直接從快取取資源。2.為什麼要用預載入 在網頁全部載入之前,對一些主要內容進行載入,以提供給使用者更好的體驗,...