當作為屬性訪問 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, ...)