模型關聯--預載入

田池發表於2019-06-26

當作為屬性訪問 Eloquent 關聯時,關聯資料是「懶載入」的。意味著在你第一次訪問該屬性時,才會載入關聯資料。不過,是當你查詢父模型時,Eloquent 可以「預載入」關聯資料。預載入避免了 N + 1 查詢問題。要說明 N + 1 查詢問題,試想一個 Book 模型關聯到 Author 模型:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Book extends Model
{
    /**
     * 獲得此書的作者。
     */
    public function author()
    {
        return $this->belongsTo('App\Author');
    }
}

現在,讓我們來獲得所有書籍和作者資料

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

foreach ($books as $book) {
    echo $book->author->name;
}

這個迴圈會執行一次查詢取回所有資料表上的書籍資料,然後又執行一次查詢獲得每本書的作者資料。如果我們有 25 本書,則迴圈就會執行 26 次查詢:1 次是獲得所有書籍資料,另外 25 條查詢用來獲得每本書的作者資料。

謝天謝地,我們使用預載入讓整個查詢減少到 2 次。這是通過指定關聯給 with 方法辦到的:

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

foreach ($books as $book) {
    echo $book->author->name;
}

整個操作,只執行了兩條查詢:

select * from books

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

相關文章