摘要:在本文中,我們將了解中的懶加載和即時加載以及它如何在后臺運行?,F(xiàn)在所有的房屋數(shù)據(jù)和在關(guān)系表中的數(shù)據(jù)都同時加載出來了,查詢的語句的是使用即時加載時僅執(zhí)行個查詢??偨Y(jié)現(xiàn)在你理解了這個過程,希望它能幫助你理解懶加載和即時加載的用法和基本原理。
Laravel中的Eloquent(ORM)的工作方式很令人驚訝,并提供訪問數(shù)據(jù)庫的非常簡單的方法。在本文中,我們將了解Laravel Eloquent中的懶加載和即時加載以及它如何在后臺運行。
Eloquent 中的關(guān)系第一步我們需要定義模型之間的關(guān)系的。在這個例子中,我將使用兩個模型,house 和 city。房子屬于一個城市,城市有很多房屋。讓我們看看模型 House 的關(guān)系:
class House extends Model { protected $fillable = [ "title", "description", "price" ]; public function city() { return $this->belongsTo("AppCity"); } }
注意:對于多對一的關(guān)系(房子屬于一個城市),函數(shù)名稱是單數(shù)。 [public function city()]
class City extends Model { protected $fillable = [ "name", "code" ]; public function houses() { return $this->hasMany("AppHouse"); } }
注意:對于一對多關(guān)系(城市有很多房屋),函數(shù)名稱是復(fù)數(shù)。 [public function houses()]懶加載
$houses = House::all();
默認(rèn)情況下,在Eloquent中訪問數(shù)據(jù)是“懶加載”,在上面的代碼中,我們獲取了所有數(shù)據(jù)在內(nèi)部表中,實際執(zhí)行的SQL查詢是:
select * from `houses`
在這一步中,關(guān)系表(城市)中的數(shù)據(jù)還沒有被獲取,如果我們想訪問關(guān)系表中的數(shù)據(jù),我們可以像這樣訪問:
foreach ($houses as $house) { echo $house->city->name; // 這就是懶加載 }
實際執(zhí)行的SQL查詢是
select * from `cities` where `cities`.`id` = ? limit 1 select * from `cities` where `cities`.`id` = ? limit 1 select * from `cities` where `cities`.`id` = ? limit 1 ...
該過程將循環(huán)房屋內(nèi)的所有記錄,并為每個循環(huán)執(zhí)行1次查詢以獲取城市數(shù)據(jù),例如我們有20個房屋記錄,查詢獲取關(guān)系表中的數(shù)據(jù)將執(zhí)行20次+1原始查詢獲取 房屋數(shù)據(jù),查詢“延遲加載”的時間是N + 1。
即時加載有時在應(yīng)用程序中使用即時加載非常有用,例如,你正在使用Ajax調(diào)用數(shù)據(jù),在這種情況下,我們必須使用預(yù)加載來準(zhǔn)備在關(guān)系表中包含數(shù)據(jù)的所有數(shù)據(jù),然后再將結(jié)果返回給Ajax。 要使用即時加載,只需在獲取數(shù)據(jù)時使用 with 方法。
$houses = House::with("city")->get();
現(xiàn)在所有的房屋數(shù)據(jù)和在關(guān)系表中的數(shù)據(jù)都同時加載出來了,查詢的SQL語句的是
select * from houses select * from cities where id in (1, 2, 3, 4, 5, ...)
使用即時加載時僅執(zhí)行2個查詢。 正如你可以看到上面的查詢,一個查詢是在房屋表中獲取所有數(shù)據(jù),另一個查詢是獲取城市表中的所有數(shù)據(jù),使用IN操作將ID與房屋表中的city_id匹配。
懶加載 和 即時加載在某些情況下,這對于即時動態(tài)加載非常有用,我們可以決定是否需要加載關(guān)系表中的數(shù)據(jù)。
$houses = House::all(); if($isLoad) { $houses->load("city"); // 對應(yīng) house model中的 city 方法 }
我們可以使用 load 方法在特定條件下加載關(guān)系表中的數(shù)據(jù)。
這一點非常有用,實際中大家可以多試試。
總結(jié)現(xiàn)在你理解了這個過程,希望它能幫助你理解懶加載和即時加載的用法和基本原理。
更多PHP知識,可以前往PHPCasts
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/30761.html
摘要:環(huán)境核內(nèi)存開啟性能監(jiān)控使用生產(chǎn)環(huán)境命令進行安裝統(tǒng)一執(zhí)行打印框架執(zhí)行時間內(nèi)存最主要差異加載所有文件整理時間線整體執(zhí)行時間時間改為加載如何動態(tài)加載可優(yōu)化可優(yōu)化為什么需要復(fù)制一份整理時間線整體執(zhí)行時間時間加載所有文件,差異差異差異差異 環(huán)境 centos7 + docker(alpine3.7) 1核 內(nèi)存2G php7.1.17 開啟opcache 性能監(jiān)控tideways_xh...
摘要:為關(guān)聯(lián)關(guān)系設(shè)置約束子模型的等于父模型的上面設(shè)置的字段的值子類實現(xiàn)這個抽象方法通過上面代碼看到創(chuàng)建實例時主要是做了一些配置相關(guān)的操作,設(shè)置了子模型父模型兩個模型的關(guān)聯(lián)字段和關(guān)聯(lián)的約束。不過當(dāng)查詢父模型時,可以預(yù)加載關(guān)聯(lián)數(shù)據(jù)。 Database 模型關(guān)聯(lián) 上篇文章我們主要講了Eloquent Model關(guān)于基礎(chǔ)的CRUD方法的實現(xiàn),Eloquent Model中除了基礎(chǔ)的CRUD外還有一個...
摘要:為了一探究竟,于是開啟了這次應(yīng)用性能調(diào)優(yōu)之旅。使用即時編譯器和都能輕輕松松的讓你的應(yīng)用程序在不用做任何修改的情況下,直接提高或者更高的性能。 這是一份事后的總結(jié)。在經(jīng)歷了調(diào)優(yōu)過程踩的很多坑之后,我們最終完善并實施了初步的性能測試方案,通過真實的測試數(shù)據(jù)歸納出了 Laravel 開發(fā)過程中的一些實踐技巧。 0x00 源起 最近有同事反饋 Laravel 寫的應(yīng)用程序響應(yīng)有點慢、20幾個并...
摘要:是一個功能豐富的框架。但是,你無法從官方文檔中找到所有可用的功能。例數(shù)據(jù)庫又插入一條為的數(shù)據(jù)。也很樂意聽到你對此的看法和想法。你可以在上找到我。 showImg(https://segmentfault.com/img/remote/1460000017973901?w=800&h=511); Laravel 是一個功能豐富的框架。但是,你無法從官方文檔中找到所有可用的功能。以下是一些...
摘要:判斷是否存在構(gòu)造函數(shù),不存在直接實例化,存在則通過來獲取輸入函數(shù),并有相應(yīng)的方法解決依賴參數(shù)問題,實現(xiàn)依賴注入。 Laravel 框架關(guān)鍵技術(shù)解析·讀書筆記(一) 第一章 入口文件 請求訪問的入口文件,主要完成幾部分工作,分別是: 自動加載函數(shù)的添加 服務(wù)器實例化與服務(wù)注冊 路由加載 請求實例化與路由分發(fā) 相應(yīng)生成與發(fā)送 其中,自動加載函數(shù)用于包含引用文件,改文件是composer...
閱讀 2006·2021-09-22 16:05
閱讀 9310·2021-09-22 15:03
閱讀 2885·2019-08-30 15:53
閱讀 1702·2019-08-29 11:15
閱讀 911·2019-08-26 13:52
閱讀 2353·2019-08-26 11:32
閱讀 1806·2019-08-26 10:38
閱讀 2567·2019-08-23 17:19