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();