10

使用 Laravel 和雄辩的 ORM,我想创建一个数组或对象,其中包含属于特定用户(已登录用户)的所有帖子和相应评论。然后将结果与 Response::eloquent(); 一起使用。返回 JSON。

基本上是伪代码:

All Posts by user ::with('comments').

或者

Posts by Auth::user()->id ::with('comments').

我按照通常的用户表、评论表和帖子表设置了我的数据库。comments 表有一个 post_id,posts 表有一个 user_id。

在没有 Laravel 的情况下这样做的漫长方法是:

SELECT * FROM posts WHERE user_id = 'user_id'
foreach($result as $post) {
    SELECT * FROM comments WHERE posts_id =  $post->id
    foreach($query as $comment) {
        $result[$i]->comments[$n] = $comment
    }
}

但我想用 Laravel 的 Eloquent ORM 来完成它。

4

1 回答 1

13

看起来你甚至不需要嵌套的急切加载,你只需要修改返回的查询,所以:

$posts = Post::with('comments')->where('user_id', '=', 1)->get();

您可以将 Eloquent 系统中的大多数方法进行菊花链式连接,通常它们只是返回一个 Fluent 查询对象。

(我还没有测试过它,但我相当肯定它会起作用。另外,你不能在 ::all() 上这样做,因为它会为你调用 ->get() 。你必须挖掘源代码找到这个的代码,我认为 Eloquent 文档没有提到它正在做的事情。)

Eager Loading Documentation还涵盖了嵌套的Eager Loading ,因此您可以加载所有用户及其帖子和评论:

您甚至可以急切地加载嵌套关系。例如,假设我们的 Author 模型具有“联系人”关系。我们可以像这样从 Book 模型中急切地加载这两个关系:

$books = Book::with(array('author', 'author.contacts'))->get();
于 2013-01-12T05:12:52.827 回答