Laravel 4.1 Eager用约束加载嵌套关系

kJa*_*esy 11 eager-loading eloquent laravel-4

我试图让带有约束的Eager-Loading嵌套关系起作用.每个人似乎都给出了热切加载嵌套关系的相同示例:

$users = User::with('posts.comments')->get();
Run Code Online (Sandbox Code Playgroud)

我想做的是获取与给定id的帖子相关的所有用户.但与此同时,我也希望得到与该帖子相关的评论.

在4.1中,我实现了后者,我可以这样做:

$comments = Comment::whereHas('post', function($query) { $query->whereId(1); })->get();
Run Code Online (Sandbox Code Playgroud)

有没有办法结合这两个并约束嵌套关系?

kJa*_*esy 8

实际上发现它比思想简单得多.

鉴于这些模型:

class User extends \Eloquent {

    public function posts()
    {
        return $this->hasMany('Post');
    }

    public function comments()
    {
        return $this->hasManyThrough('Comment', 'Post');
    }       

}

class Post extends \Eloquent {

    public function user()
    {
        return $this->belongsTo('User');
    }

    public function comments()
    {
        return $this->hasMany('Comment');
    }       

}

class Comment extends \Eloquent {

    public function post()
    {
        return $this->belongsTo('Post');
    }

}
Run Code Online (Sandbox Code Playgroud)

然后我们可以获取具有给定帖子的用户,如下所示:

$userId = 2; $postId = 5;
$user =  User::with(['comments' => function($q) use($postId) { $q->where('post_id', $postId); }])->find($userId);
Run Code Online (Sandbox Code Playgroud)

这在使用get()时不起作用,因为它不会将用户限制为仅与给定帖子相关的用户.但这没关系,因为我们只对post_id $ postId的一篇文章感兴趣.由于帖子属于一个且只有一个用户,我们不必担心其他用户.因此,我们可以使用find()或first()来获得实际结果.

此外,'中间'关系即'post'会自动返回,我们可以通过执行以下操作来获得它,而无需使用前面答案中建议的额外'with':

var_dump($user->posts);
Run Code Online (Sandbox Code Playgroud)


小智 7

如果模型中的关系是正确的,您可以简单地做:

$user = User::with('posts.comments')->get();
Run Code Online (Sandbox Code Playgroud)

您可以根据需要添加任意数量的关系(或最多内存限制;)).

它也适用于数据透视表.