然后用Laravel Eloquent ORM加载一对多的数组

时间:2013-01-11 23:02:32

标签: php orm laravel eloquent

使用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来实现它。

1 个答案:

答案 0 :(得分:13)

看起来你甚至不需要嵌套的eager加载,你只需要修改带有return的查询,所以:

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

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

(我没有对它进行过测试,但我相当确定它会工作。另外,你不能在:: all()上执行它,因为那些调用 - > get()适合你。你必须挖掘源代码来找到这个,我不认为Eloquent文档提到它正在做的事情。)

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

  

您甚至可能急于加载嵌套关系。例如,让我们   假设我们的作者模型具有“联系人”关系。我们可以渴望   从我们的Book模型加载两个关系,如下所示:

$books = Book::with(array('author', 'author.contacts'))->get();