Laravel 4.1 Eloquent - 过滤关系集合

时间:2014-01-05 13:05:58

标签: php orm laravel eloquent

我在使用laravel 4.1 hasWhere过滤关系时遇到问题。

迭代1 - 获取所有帖子:完成

$posts = Post::all();

迭代2 - 获取所有帖子延迟加载评论:完成

$posts = Post::with('comments')->get();

迭代3 - 仅获取包含评论和延迟加载的帖子:完成

$posts = Post::with('comments')->has('comments')->get();

迭代4 - 仅获取已发布评论和延迟加载的帖子:已损坏

$posts = Post::with('comments')
    ->whereHas('comments', function($q) {
        return $q->where('published', '=', 1);
    })
    ->get();

print_r($posts->toArray())的输出显示迭代3和4的输出完全相同。 我无法根据'comments.published' = 1

的条件过滤关系

2 个答案:

答案 0 :(得分:2)

我找到了解决方案,但我不确定这是最优雅的解决方案。因此,我将这一点公开以获得更好的建议。

    $posts = Post::
        ->whereHas('comments', function($q)
            {
                $q->where('published', '=', 1);
            })
        ->with([
            'comments' => function($q)
            {
                $q->where('published', '=', 1);
            },
            ])->get();

基本上,我的解决方案包括过滤雄辩的结果,并分别过滤延迟加载。这有必要吗?有没有更好的方法来实现这一目标?

答案 1 :(得分:0)

我花了一段时间才弄清楚这一点,所以这对我有用..

$postsFilter = Comments::with('Posts')->where('published', 1)->first();
$posts= $postsFilter ->posts;

当然你必须在模型定义中与belongsToOne或belongsToMany绑定。

//如果有人阅读也希望使用预过滤数据,你可以将一个闭包传递给'with'

$usersFilter = Addresses::with(array('Users' => function($query) use ($keyword){ 
    $query->where('somefield', $keyword);
}))->where('town', $keyword)->first();
$myUsers = $usersFilter->users;