私は外部キーを介してレコードからすべてのデータを取得する適切な方法を理解しようとしています。ユーザーが「本棚」に本を追加できるシンプルなアプリがあります。
これが私のテーブルです:
[〜#〜]ユーザー[〜#〜]
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`)
私の雄弁モデルでは、bookshelf
hasMany本とbookshelf_books
belongsTo a bookshelf
そして私はモデルにそれらを設定しました。
何が起こるかは、ユーザーが「本棚」を作成し、本のリストからそれに本を追加することです。
ユーザーの本で本棚をレンダリングする必要があるところです。
Bookshelf :: find($ id)-> booksのような呼び出しで本棚の本を取得すると、その本棚に属する本は正常に返されますが、本棚テーブルの列のみが返されます。そのため、本棚ID、ユーザーID、および本IDを返します。
私が返したいのは、IDだけでなく、本棚にある本を照会したときの本自体のすべてのデータです。例えば。 [{"book_id":1, "pages":364, "number_of_chapters":14},{"book_id":2, "pages":211, "number_of_chapters":9}]
。
Laravel/Eloquent ORMでこの「結合」をさらに一歩進める方法を理解しようと、一日中頭を悩ませてきました。
これでどんな助けも大好きです、ありがとう!!
手動で行って、独自のアレイを構築するのはどうでしょう。
$bookshelf = Bookshelf::find($id)->books;
$thebooks = array();
foreach($bookshelf as $val){
$book = Book::find($val->book_id);
$thebooks[] = $book;
}
次に、$thebooks
をビューに返します。本のモデルの配列になります。
あなたが持っているものは正しいはずです。
$bookshelf = Bookshelf::find($id)->books;
本を入手するには、ループを作成します...
_@foreach($bookshelf->books as $book)
{{ $book->name }}
{{ $book->title }}
@endforeach
_
これをさらに進めるために、もしあなたの本がbelongTo()
であるAuthorモデルを持っているなら、あなたは次のようなことさえできます。
_@foreach($bookshelf->books as $book)
{{ $book->name }}
{{ $book->title }}
{{ $book->author->name }}
@endforeach
_
このクエリを試してください
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"