@Fedooot01

Как спроектировать таблицы и построить отношения в Laravel Eloquent для такого типа данных?

Здравствуйте.

Есть БД, содержащая в себе пользователей, книги и комментарии пользователей к книгам, обслуживаемая Laravel.

Есть следующие таблицы:
users, с полями id, name
books, с полями id, name
comments, с полями id, user_id, book_id, comment

Хотелось бы в Laravel не слишком мудрено с помощью eloquent составить запрос, который для заданного пользователя выведет список книг, к которым он оставил комментарий и для каждой книги только его комментарии.

Примерно так или чуть сложнее (без map'ов по полученным моделям результатами других запросов руками):
User::whereId(1)->with(['books', 'books.comments'])->get();


Чтобы в итоге получилось что-то вроде:
[
   'id' => 1,
   'name' => 'Иван',
   'books' => [
      [
         'id' => 'book-1',
         'name' => 'Три поросёнка',
         'comments' => [
            [
               'id' => 'comment-1',
               'user_id' => 1,
               'book_id' => 'book-1',
               'comment' => 'Класс!',
            ],
            [
               'id' => 'comment-2',
               'user_id' => 1,
               'book_id' => 'book-1',
               'comment' => 'Очень глубоко...',
            ],
         ],
      ],
	  [
         'id' => 'book-2',
         'name' => 'Букварь',
         'comments' => [
            [
               'id' => 'comment-3',
               'user_id' => 1,
               'book_id' => 'book-2',
               'comment' => 'Пишу комментарий',
            ],
            [
               'id' => 'comment-4',
               'user_id' => 1,
               'book_id' => 'book-2',
               'comment' => 'Только сейчас дошел посыл автора',
            ],
         ],
      ],
   ],
]


Как это реализовать? Какие отношения вроде hasManyThrough и т. д. нужно сделать?
  • Вопрос задан
  • 201 просмотр
Решения вопроса 1
@jazzus
Добавляем отношение в User
public function booksWhereHasMyComments()
{
     return $this->hasManyThrough(Book::class, Comment::class);
}

Запрашиваем
$user->booksWhereHasMyComments()
    ->with(['comments' => function ($query) use ($user) {
        $query->where('user_id', $user->id);
    }])
    ->get();
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы