@Bodrosh

Как правильно составить сложный запрос в Laravel?

Здравствуйте, можно ли в laravel составить запрос с получением связанных данных через несколько таблиц?
Есть таблицы:
Пользователи (users)
Проекты_пользователей (projects, связаны с user_id - у 1-го пользователя множество проектов)
Посты_пользователей (posts, связаны с project_id - у 1-го проекта множество постов)
Услуги_пользователей (services, связаны с user_id - у 1-го пользователя множество услуг)

Т.е. для получения услуг пользователя из конкретного поста такая схема $post->project->user->services()

Можно ли составить запрос так, чтобы получать все записи Посты_пользователей вместе со связанными данными Услуги_пользователей текущего поста (точнее данные поста + кол-во услуг пользователя, у которых определенный статус)

Речь не об SQL запросе, его составить не проблема, вопрос именно о реализации этого в Laravel, т.к. используется внутренняя пагинация (хочется использовать внутренний метод ->paginate()). Спасибо.
  • Вопрос задан
  • 335 просмотров
Решения вопроса 1
@Bodrosh Автор вопроса
Запрос SQL:
SELECT p.id, p.data, u.id as user_id, SUM(su.status) as sum_status
            FROM `posts` as p
            LEFT JOIN projects as p ON p.id = p.project_id
            LEFT JOIN users as u ON u.id = p.user_id
            LEFT JOIN service_user as su ON su.user_id = u.id
            GROUP BY su.user_id, p.id, p.data

Итоговый результат:
$posts = DB::table('posts')
            ->leftJoin('projects', 'posts.project_id', '=', 'projects.id')
            ->leftJoin('users', 'projects.user_id', '=', 'users.id')
            ->leftJoin('service_user', 'users.id', '=', 'service_user.user_id')
            ->leftJoin('services', 'service_user.service_id', '=', 'services.id')
            ->groupBy('service_user.user_id', 'posts.id', 'posts.data')
            ->select('posts.id',  'posts.data',  'service_user.user_id', DB::raw("SUM(service_user.status) as sum_status") )
            ->paginate(50);
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@ka4an90
https://laravel.su/docs/8.x/queries#joins

вот тут почитай, есть join-ы простые, есть расширенные, дока вроде понятная, вопросов быть не должно
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы