Как сократить количество SQL запросов?

Допустим что у нас есть модель, описывающая книгу. И есть модель, которая описывает автора книги. У самой книги в таблице базы данных есть поле author_id, которое ссылается на запись из соответствующей таблицы автора. Перед нами стоит задача вывести всех авторов книг. Первое что приходит в голову, это использовать ORM связи. Сделать это можно так: 

$books = Book::all();

foreach ($books as $book) {
echo $book->author->name;
}

Но если книг у нас 20, то соответственно помимо запроса, получающего все книги, будут так же сделаны 20 запросов для получения автора для каждой книги. Это не очень здорово, поэтому запросы можно оптимизировать с помощью метода with():

$books = Book::with('author')->get();
foreach ($books as $book) {
  echo $book->author->name;
}

В чём же разница, по сравнению с предыдущим подходом? На этот раз мы используем метод with, цель которого и заключается в сокращении таких ненужных запросов. Он заранее считывает значение поля author_id, и обходится всего лишь двумя запросами: 

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

То есть теперь ORM не придётся лезть каждый раз в базу, чтобы получить объект автора. Происходит так за счёт того, что в этих двух запросах уже содержится нужная информация. 

Комментарии ()

    Вы должны авторизоваться, чтобы оставлять комментарии.