Как получить полные данные записи по внешнему ключу в laravel?

Я пытался выяснить, как получить все данные из записи через внешний ключ. У меня есть простое приложение, в котором пользователи могут добавлять книги в свою "книжную полку".

Вот мои таблицы:

ПОЛЬЗОВАТЕЛИ

ID   |   NAME   | 

КНИГИ

ID   |   PAGES   |   NUMBER_OF_CHAPTERS

BOOKSHELF

ID   |   USER_ID (foreign key to `users.id`)   | 

BOOKSHELF_BOOKS

ID   |   BOOKSHELF_ID (foreign key to `bookshelf.id`)   | BOOKS_ID (foreign key to `books.id`)

В моих Eloquent Models a bookshelf hasMany books и bookshelf_books принадлежит To bookshelf, и я установил их в своих моделях.

Что происходит, пользователи создают "книжную полку" и добавляют к ней книги из списка книг.

Я нахожусь в точке, где мне нужно сделать книжную полку с помощью пользовательских книг.

Когда я беру книги книжной полки с вызовом типа Bookshelf:: find ($ id) → books, книги, которые принадлежат к этой книжной полке, возвращаются только в порядке... но только столбцы из таблицы книжной полки. Поэтому я возвращаю идентификатор книжной полки, идентификатор пользователя и идентификатор книги.

То, что я хочу вернуть, - это все данные самой книги, когда я запрашиваю книги на книжной полке, а не только ее идентификатор. НАПРИМЕР. [{"book_id":1, "pages":364, "number_of_chapters":14},{"book_id":2, "pages":211, "number_of_chapters":9}].

Я весь день царапал себе голову, пытаясь понять, как это "присоединиться" на один шаг дальше в Laravel/Eloquent ORM.

Хотелось бы помочь с этим, спасибо!

Ответы

Ответ 2

Что у вас должно быть правильно.

$bookshelf = Bookshelf::find($id)->books;

Чтобы получить ваши книги, вы создали бы цикл...

@foreach($bookshelf->books as $book)
   {{ $book->name }}
   {{ $book->title }}
@endforeach

Чтобы сделать это дальше, если у вас была модель автора, в которой ваши книги были бы belongTo(), вы могли бы даже сделать что-то вроде.

@foreach($bookshelf->books as $book)
   {{ $book->name }}
   {{ $book->title }}
   {{ $book->author->name }}
@endforeach

Ответ 3

Как просто сделать это вручную и создать собственный массив.

  $bookshelf = Bookshelf::find($id)->books;
  $thebooks = array();

  foreach($bookshelf as $val){
  $book = Book::find($val->book_id);
  $thebooks[] = $book;
  }

Затем просто верните $thebooks в представление. Который будет массивом моделей книг.

Ответ 4

Попробуйте этот запрос

SELECT b.id, b.pages, b.number_of_chapters 
FROM bookshelf bs 
JOIN bookshelf_books bsb ON bsb.bookshelf_id = bs.id 
JOIN books b ON b.id = bsb.books_id 
WHERE bs.id = "Id of bookshelf"

Ответ 5

SELECT * 
FROM BOOKSHELF_BOOKS 
JOIN BOOKSHELF ON BOOKSHELF_BOOKS.BOOKSHELF_ID = BOOKSHELF.ID 
JOIN USERS.ID = BOOKSHELF.USER_ID

Попробуйте этот sql-оператор, он будет работать.