如何通过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中的外键检索记录的完整数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 LINQ 中的外键列检索单个记录?

无法从 Laravel Vue 通讯录项目中的外键表中获取数据

:完整性约束违规:1452 无法添加或更新子行:laravel 迁移中的外键约束失败

如何修复laravel迁移中的外键错误

Laravel 5.4:无法从关系中检索数据

如何在删除时处理 MySql + Laravel 中的外键约束?