如何通过Laravel中的外键检索记录的完整数据?

16

我一直在尝试找出通过外键获取记录中所有数据的正确方式。我有一个简单的应用程序,用户可以将书籍添加到他们的“书架”中。

这是我的表格:

用户

ID   |   NAME   | 

书籍

ID   |   PAGES   |   NUMBER_OF_CHAPTERS

书架

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

书架上的书籍

ID   |   BOOKSHELF_ID (foreign key to `bookshelf.id`)   | BOOKS_ID (foreign key to `books.id`)
在我的Eloquent Models中,一个“书架(bookshelf)”拥有多个书籍(books),而“书架-书籍(bookshelf_books)”属于一个“书架”,我已经在我的模型中设置好了这些关联。用户可以创建一个“书架”并从书籍列表中添加书籍到它里面。现在我需要渲染包含用户书籍的“书架(shelf)”。 当我通过像Bookshelf :: find($id)-> books这样的调用检索我的“书架书籍(bookshelf books)”时,属于该“书架”的书籍返回的很好...但仅限于“书架(bookshelf)”表的列。所以我只能得到书架ID、用户ID和书籍ID等信息。但是我希望在查询“书架(shelf)”中的书籍时返回书籍本身的所有数据,而不仅仅是它的ID。例如:[{"book_id":1, "pages":364, "number_of_chapters":14},{"book_id":2, "pages":211, "number_of_chapters":9}]。我一整天都在想如何在Laravel / Eloquent ORM中进一步执行这个“join”。如果有任何帮助,我将不胜感激!谢谢!!

1
这应该可以运行:DB::table('books') ->select('BOOKS.ID', 'BOOKS.PAGES','BOOKS.NUMBER_OF_CHAPTERS') ->join('BOOKSHELF_BOOKS', 'BOOKS.ID', '=', 'BOOKSHELF_BOOKS.BOOKS_ID') ->join('bookshelf', 'BOOKSHELF_BOOKS.BOOKSHELF_ID', '=', 'BOOKSHELF.ID') ->where('bookshelf.user_id', '=', $id_user) ->get(); - Albert Casadessús
是的,这个可行,干得好,阿尔伯特。不过我忍不住想,也许使用Laravel的ORM有更简洁的方法,或许这只是一厢情愿。 - user2551866
我没法试一下,但是:$books = Book::join('BOOKSHELF_BOOKS', 'BOOKS.ID', '=', 'BOOKSHELF_BOOKS.BOOKS_ID')->join(....//rest of the joins - Albert Casadessús
5个回答

21

2
嗨,除了正常的关系之外,我是否需要在我的模型关系中设置任何内容? - Gokigooooks

3
假如只是手动操作,自己构建一个数组呢?
  $bookshelf = Bookshelf::find($id)->books;
  $thebooks = array();

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

然后只需将$thebooks返回给视图。这将是一组书籍模型的数组。


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

-1

尝试这个查询

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"

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

尝试这个 SQL 语句,它会起作用的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,