預加載
當作為屬性訪問 Eloquent 關聯時,關聯數據是「懶加載」的。意味着在你第一次訪問該屬性時,才會加載關聯數據。不過,是當你查詢父模型時,Eloquent 可以「預加載」關聯數據。預加載避免了 N + 1 查詢問題。要說明 N + 1 查詢問題,試想一個 Book
模型關聯到 Author
模型:
現在,讓我們來獲得所有書籍和作者數據:
這個循環會運行一次查詢取回所有數據表上的書籍數據,然后又運行一次查詢獲得每本書的作者數據。如果我們有 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, ...)
可以批量查詢關聯數據