Laravel での N+1 クエリ (熱心な読み込み)

N+1 では、Laravel を使用して ORM を実行できませんでした。

class Book extends Model {

public function author()

{

return $this->belongsTo(‘AppAuthor’);

}

}

ここで、すべての本を次のように繰り返します

foreach (Book::all() as $book)

{

echo $book->author->name;

}

上記のコードは、最初にすべての書籍を取得し、次に各ループで著者テーブルにクエリを実行して著者の名前を取得します。 したがって、データベースに 25 冊の書籍がある場合、データベースに対して合計 26 回クエリが実行されます (book:all を取得する 1 回を含む)。 わかりました、それは大丈夫ではありません。 この問題を解決するために、laravel は次のテクニックを提供します。

foreach (Book::with(‘author’)->get() as $book)

{

echo $book->author->name;

}

Đối với vòng lặp trên nó chỉ thực thi 2 câu truy vấn

select * from books

 

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

Nếu có nhiều bảng cần lấy ra thì ta cũng có thể viết như sau

$books = Book::with(‘author’, ‘publisher’)->get();

Nếu các bảng có ràng buộc về quan hệ, ví dụ như ta cần lấy cả thông tin liên hệ của tác giả nhưng nó nằm ở một bảng khác thì câu lệnh sau đây sẽ lấy luôn cả 2 bảng author và contact

$books = Book::with(‘author.contacts’)->get();

クエリに追加の条件を指定する必要がある場合は、次の手順を実行します。

$users = User::with([‘posts’ => function($query)

{

$query->where(‘title’, ‘like’, ‘%first%’);

}])->get();

または、配置条件を追加することもできます

$users = User::with([‘posts’ => function($query)

{

$query->orderBy(‘created_at’, ‘desc’);

 

}])->get();

Bài viết liên quan