W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
當以屬性方式訪問 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, ...)
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: