Ответ 1
Изменить
Bookshelf::find($id)->books
к
Bookshelf::with('books')->find($id)->books
Я пытался выяснить, как получить все данные из записи через внешний ключ. У меня есть простое приложение, в котором пользователи могут добавлять книги в свою "книжную полку".
Вот мои таблицы:
ПОЛЬЗОВАТЕЛИ
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.
Хотелось бы помочь с этим, спасибо!
Изменить
Bookshelf::find($id)->books
к
Bookshelf::with('books')->find($id)->books
Что у вас должно быть правильно.
$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
Как просто сделать это вручную и создать собственный массив.
$bookshelf = Bookshelf::find($id)->books;
$thebooks = array();
foreach($bookshelf as $val){
$book = Book::find($val->book_id);
$thebooks[] = $book;
}
Затем просто верните $thebooks
в представление. Который будет массивом моделей книг.
Попробуйте этот запрос
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"
SELECT *
FROM BOOKSHELF_BOOKS
JOIN BOOKSHELF ON BOOKSHELF_BOOKS.BOOKSHELF_ID = BOOKSHELF.ID
JOIN USERS.ID = BOOKSHELF.USER_ID
Попробуйте этот sql-оператор, он будет работать.