如何通过laravel中的外键检索记录的完整数据?
Posted
技术标签:
【中文标题】如何通过laravel中的外键检索记录的完整数据?【英文标题】:How to retrieve full data of record by its foreign key in laravel? 【发布时间】:2013-07-26 06:33:05 【问题描述】:我一直在尝试找出通过外键从记录中获取所有数据的正确方法。我有一个简单的应用程序,用户可以在其中将书籍添加到他们的“书架”中。
这是我的桌子:
用户
ID | NAME |
书籍
ID | PAGES | NUMBER_OF_CHAPTERS
书架
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 模型中,bookshelf
有很多书,bookshelf_books
属于 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 中更进一步地“加入”这个“加入”。
希望有任何帮助,谢谢!!
【问题讨论】:
应该可以: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();
是的,这行得通,艾伯特干得好。我不禁认为必须有一种更清洁的方式来使用 laravel 的 ORM,但也许是一厢情愿
我不能尝试但是:$books = Book::join('BOOKSHELF_BOOKS', 'BOOKS.ID', '=', 'BOOKSHELF_BOOKS.BOOKS_ID')->join(....//rest of the joins
【参考方案1】:
SELECT *
FROM BOOKSHELF_BOOKS
JOIN BOOKSHELF ON BOOKSHELF_BOOKS.BOOKSHELF_ID = BOOKSHELF.ID
JOIN USERS.ID = BOOKSHELF.USER_ID
试试这个sql语句,它会起作用的。
【讨论】:
【参考方案2】:试试这个查询
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】:如果只是手动完成,然后构建自己的数组。
$bookshelf = Bookshelf::find($id)->books;
$thebooks = array();
foreach($bookshelf as $val)
$book = Book::find($val->book_id);
$thebooks[] = $book;
然后将$thebooks
返回到视图。这将是一系列书籍模型。
【讨论】:
【参考方案4】:Just eager load the relationship
改变
Bookshelf::find($id)->books
到
Bookshelf::with('books')->find($id)->books
【讨论】:
嗨,我需要为此在模型关系中设置什么吗?除了正常的关系?【参考方案5】:你所拥有的应该是正确的。
$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
【讨论】:
以上是关于如何通过laravel中的外键检索记录的完整数据?的主要内容,如果未能解决你的问题,请参考以下文章
无法从 Laravel Vue 通讯录项目中的外键表中获取数据