Laravel 8 預(yù)加載

2021-07-19 11:40 更新

當以屬性方式訪問 Eloquent 關(guān)聯(lián)時,關(guān)聯(lián)數(shù)據(jù)「懶加載」。這意味著直到第一次訪問屬性時關(guān)聯(lián)數(shù)據(jù)才會被真實加載。不過 Eloquent 能在查詢父模型時「預(yù)先載入」子關(guān)聯(lián)。預(yù)加載可以緩解 N + 1 查詢問題。為了說明 N + 1 查詢問題,考慮 Book 模型關(guān)聯(lián)到 Author 的情形:



namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Book extends Model

{

    /**

     * 獲取書籍作者

     */

    public function author()

    {

        return $this->belongsTo('App\Models\Author');

    }

} 

現(xiàn)在,我們來獲取所有的書籍及其作者:

$books = App\Models\Book::all();

foreach ($books as $book) {

    echo $book->author->name;

} 

此循環(huán)將執(zhí)行一個查詢,用于獲取全部書籍,然后為每本書執(zhí)行獲取作者的查詢。如果我們有 25 本書,此循環(huán)將運行 26 個查詢:1 個用于查詢書籍,25 個附加查詢用于查詢每本書的作者。

謝天謝地,我們能夠使用預(yù)加載將操作壓縮到只有 2 個查詢。在查詢時,可以使用 with 方法指定想要預(yù)加載的關(guān)聯(lián):

$books = App\Models\Book::with('author')->get();

foreach ($books as $book) {

    echo $book->author->name;

} 

在這個例子中,僅執(zhí)行了兩個查詢:

select * from books

select * from authors where id in (1, 2, 3, 4, 5, ...) 
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號