Как оптимизировать получение трёх выборок из одной таблицы?

В Laravel есть несколько способов оптимизировать получение трех выборок из одной таблицы. Ниже я расскажу о двух наиболее эффективных подходах.

1. Использование метода with() вместе с жадной загрузкой данных (Eager Loading):
Жадная загрузка данных позволяет вам загрузить связанные модели одним запросом вместо нескольких отдельных запросов.
Представьте, что у вас есть модель User, а связанная с ней модель Post. Вы хотите получить всех пользователей
и для каждого пользователя получить 3 последних поста. Вы можете сделать это следующим образом:

   $users = User::with(['posts' => function ($query) {
        $query->orderBy('created_at', 'desc')->take(3);
   }])->get();

В данном примере мы использовали метод with(), чтобы загрузить связанные модели posts для каждого пользователя
и использовали анонимную функцию для указания дополнительных условий запроса, в данном случае мы сортируем по дате
создания (created_at) и берем только 3 записи (take(3)).

Этот подход позволяет сократить число запросов к базе данных и значительно ускорить получение данных.

2. Использование метода raw() для написания собственного SQL-запроса:
Если вы хотите выполнить сложную выборку, которая не может быть оптимизирована с использованием стандартных методов
Laravel, вы можете воспользоваться методом raw() для написания собственного SQL-запроса.

Например, предположим, что вам нужно получить трри выборки из одной таблицы posts для каждого пользователя, у которого
имя начинается с "A". Вы можете сделать это следующим образом:

   $query = "SELECT * FROM posts
             WHERE user_id IN (
                SELECT id FROM users
                WHERE name LIKE 'A%'
             )
             ORDER BY created_at DESC
             LIMIT 3";

   $results = DB::select(DB::raw($query));

В этом примере мы написали собственный SQL-запрос, который выбирает записи из таблицы posts, используя подзапрос для
получения пользователей, и применяет условия и сортировку как требуется. Затем мы выполняем этот запрос с помощью метода
select() и передаем туда результат выполнения метода raw(), который принимает SQL-запрос в виде строки.

Использование метода raw() позволяет вам получить полный контроль над SQL-запросом и тем самым оптимизировать его для
ваших конкретных потребностей.

Важно помнить, что при использовании метода raw() вы отказываетесь от некоторых преимуществ Laravel, таких как
автоматическая генерация SQL-запроса и обработка ошибок. Поэтому следует быть осторожными при его применении.

В обоих примерах я представил подходы, которые помогут оптимизировать получение трех выборок из одной таблицы в Laravel.
Выбор конкретного подхода зависит от конкретных условий и требований вашего проекта.