【问题标题】:Laravel 4.1 Eloquent - Filtering a relationship collectionLaravel 4.1 Eloquent - 过滤关系集合
【发布时间】:2014-01-22 21:46:36
【问题描述】:

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

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

$posts = Post::all();

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

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

迭代 3 - 仅获取带有 cmets 和延迟加载的帖子:完成

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

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

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

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

【问题讨论】:

  • 我认为问题在于您在查询的 where 方法上调用了 return。只需致电$q->where('published', '=', 1);(没有return 声明),您应该会很好。

标签: php orm laravel eloquent


【解决方案1】:

我找到了一个解决方案,但我不确定这是不是最优雅的解决方案。因此,我将保留此信息以获取更好的建议。

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

基本上,我的解决方案包括过滤 eloquent 结果,以及单独过滤延迟加载。这是必要的吗?有没有更好的方法来实现这一点?

【讨论】:

  • 您不需要 with 部分中的第二个过滤器:这将简单地使用过滤器对(已经)过滤的值进行第二次查询。所以你基本上在做的是一个带有过滤器的查询,然后是另一个带有过滤器的查询(预先加载的)。在这种情况下,只需调用 with('comments') 就可以了。
【解决方案2】:

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

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

当然,你必须在模型定义中绑定belongsToOne 或belongToMany。

// 如果有人阅读也想使用预过滤的数据,您可以将闭包传递给“with”

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-15
    • 2014-01-15
    • 2015-04-04
    • 1970-01-01
    • 2017-04-12
    • 1970-01-01
    • 1970-01-01
    • 2021-07-10
    相关资源
    最近更新 更多