一、什么是 Laravel Eloquent Eager Loading
Laravel Eloquent Eager Loading 是一種優(yōu)化數(shù)據(jù)庫(kù)查詢的方法,可以避免在一個(gè)循環(huán)中多次查詢數(shù)據(jù)庫(kù)而導(dǎo)致的性能問(wèn)題。
當(dāng)需要獲取一個(gè)模型及其關(guān)聯(lián)模型的數(shù)據(jù)時(shí),如果使用常規(guī)的查詢方法,每個(gè)關(guān)聯(lián)模型都會(huì)獨(dú)立執(zhí)行一條數(shù)據(jù)庫(kù)查詢,從而導(dǎo)致數(shù)據(jù)庫(kù)查詢次數(shù)的增加和潛在的性能問(wèn)題。而使用 Eager Loading,則可以預(yù)先加載關(guān)聯(lián)數(shù)據(jù),減少數(shù)據(jù)庫(kù)查詢次數(shù),提高性能。
它的核心是Eager Loading,它告訴Eloquent你想要抓取一個(gè)具有特定關(guān)系的模型,這樣框架就會(huì)產(chǎn)生一個(gè)更高效的查詢來(lái)抓取你需要的所有數(shù)據(jù)。通過(guò)快速加載,您可以將許多查詢減少到一個(gè)或兩個(gè)。
二、Eloquent 模型約定
現(xiàn)在,我們來(lái)看一個(gè) Flight 模型的示例,我們將用它從 flights 數(shù)據(jù)庫(kù)表中檢索和存儲(chǔ)數(shù)據(jù)信息:
1、數(shù)據(jù)表名稱
請(qǐng)注意,我們并沒(méi)有告訴 Eloquent 我們的 Flight 模型使用哪個(gè)數(shù)據(jù)表。 除非明確地指定了其它名稱,否則將使用類的復(fù)數(shù)形式「蛇形命名」來(lái)作為表名。因此,在這種情況下,Eloquent 將假設(shè) Flight 模型存儲(chǔ)的是 flights 數(shù)據(jù)表中的數(shù)據(jù),而 AirTrafficController 模型會(huì)將記錄存儲(chǔ)在 air_traffic_controllers 表中。
你可以通過(guò)在模型上定義 table 屬性來(lái)指定自定義數(shù)據(jù)表:
2、主鍵
Eloquent 也會(huì)假設(shè)每個(gè)數(shù)據(jù)表都有一個(gè)名為 id 的主鍵列。你可以定義一個(gè)受保護(hù)的 $primaryKey 屬性來(lái)重寫約定。
此外,Eloquent 假設(shè)主鍵是一個(gè)自增的整數(shù)值,這意味著默認(rèn)情況下主鍵會(huì)自動(dòng)轉(zhuǎn)換為 int 類型。如果您希望使用非遞增或非數(shù)字的主鍵則需要設(shè)置公共的 $incrementing 屬性設(shè)置為 false:
如果你的主鍵不是一個(gè)整數(shù),你需要將模型上受保護(hù)的 $keyType 屬性設(shè)置為 string:
3、時(shí)間戳
默認(rèn)情況下,Eloquent 預(yù)期你的數(shù)據(jù)表中存在 created_at 和 updated_at 兩個(gè)字段 。如果你不想讓 Eloquent 自動(dòng)管理這兩個(gè)列, 請(qǐng)將模型中的 $timestamps 屬性設(shè)置為 false:
如果需要自定義時(shí)間戳的格式,在你的模型中設(shè)置 $dateFormat 屬性。這個(gè)屬性決定日期屬性在數(shù)據(jù)庫(kù)的存儲(chǔ)方式,以及模型序列化為數(shù)組或者 JSON 的格式:
如果你需要自定義存儲(chǔ)時(shí)間戳的字段名,可以在模型中設(shè)置 CREATED_AT 和 UPDATED_AT 常量的值來(lái)實(shí)現(xiàn):
4、數(shù)據(jù)庫(kù)連接
默認(rèn)情況下,Eloquent 模型將使用你的應(yīng)用程序配置的默認(rèn)數(shù)據(jù)庫(kù)連接。如果你想為模型指定一個(gè)不同的連接,設(shè)置 $connection 屬性即可:
延伸閱讀1:Laravel 的 Eloquent ORM 是什么
Laravel 的 Eloquent ORM 提供了一個(gè)漂亮、簡(jiǎn)潔的 ActiveRecord 實(shí)現(xiàn)來(lái)和數(shù)據(jù)庫(kù)交互。每個(gè)數(shù)據(jù)庫(kù)表都有一個(gè)對(duì)應(yīng)的「模型」用來(lái)與該表交互。你可以通過(guò)模型查詢數(shù)據(jù)表中的數(shù)據(jù),以及在數(shù)據(jù)表中插入新記錄。