W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
預(yù)載入是用來減少 N + 1 查詢問題。例如,一個(gè) Book 模型數(shù)據(jù)會(huì)關(guān)聯(lián)到一個(gè) Author 。關(guān)聯(lián)會(huì)像下面這樣定義:
class Book extends Model {
public function author()
{
return $this->belongsTo('App\Author');
}
}
現(xiàn)在考慮下面的代碼:
foreach (Book::all() as $book)
{
echo $book->author->name;
}
上面的循環(huán)會(huì)執(zhí)行一次查詢?nèi)』厮袛?shù)據(jù)庫表上的書籍,然而每本書籍都會(huì)執(zhí)行一次查詢?nèi)〉米髡?。所以若我們?25 本書,就會(huì)進(jìn)行 26次查詢。
很幸運(yùn)地,我們可以使用預(yù)載入大量減少查詢次數(shù)。使用 with 方法指定想要預(yù)載入的關(guān)聯(lián)對(duì)象:
foreach (Book::with('author')->get() as $book)
{
echo $book->author->name;
}
現(xiàn)在,上面的循環(huán)總共只會(huì)執(zhí)行兩次查詢:
select * from books
select * from authors where id in (1, 2, 3, 4, 5, ...)
使用預(yù)載入可以大大提高程序的性能。
當(dāng)然,也可以同時(shí)載入多種關(guān)聯(lián):
$books = Book::with('author', 'publisher')->get();
甚至可以預(yù)載入巢狀關(guān)聯(lián):
$books = Book::with('author.contacts')->get();
上面的例子中, author 關(guān)聯(lián)會(huì)被預(yù)載入, author 的 contacts 關(guān)聯(lián)也會(huì)被預(yù)載入。
預(yù)載入條件限制
有時(shí)您可能想要預(yù)載入關(guān)聯(lián),同時(shí)也想要指定載入時(shí)的查詢限制。下面有一個(gè)例子:
$users = User::with(['posts' => function($query)
{
$query->where('title', 'like', '%first%');
}])->get();
上面的例子里,我們預(yù)載入了 user 的 posts 關(guān)聯(lián),并限制條件為 post 的 title 字段需包含 "first" 。
當(dāng)然,預(yù)載入的閉合函數(shù)里不一定只能加上條件限制,也可以加上排序:
$users = User::with(['posts' => function($query)
{
$query->orderBy('created_at', 'desc');
}])->get();
也可以直接從模型的 collection 預(yù)載入關(guān)聯(lián)對(duì)象。這對(duì)于需要根據(jù)情況決定是否載入關(guān)聯(lián)對(duì)象時(shí),或是跟緩存一起使用時(shí)很有用。
$books = Book::all();
$books->load('author', 'publisher');
你可以傳入一個(gè)閉包來對(duì)查詢構(gòu)建器進(jìn)行條件限制:
$books->load(['author' => function($query)
{
$query->orderBy('published_date', 'asc');
}]);
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: