如何在Laravel中限制查询中hasMany关系的范围

时间:2018-01-11 07:21:01

标签: php laravel laravel-5 eloquent laravel-eloquent

我正在开展一个基于laravel的项目,包括作者,帖子和评论作为模型。

模型之间的关系如下: 作者 - > hasMany Post 发布 - >有很多评论。

问题如下: 作者发了多个帖子,所有帖子都有多个评论。我想通过内部成员的最新帖子获得作者的评论。

我的模型如下所示 -

Author.php

public function post() {
    return $this->hasMany('App\Post');
}

public function latestPost() {
    return $this->hasOne('App\Post', 'latest_post_id', 'id')-
 >orderBy('created_at', 'desc');
}

post.php中

public function comment() {
    return $this->hasMany('App\Comment', 'post_id', 'id');
}

我用来获取数据的查询如下:

$author_count = Author::whereHas('latestPost.comment', function ($query) {
    $query->createdByInternal();
})->count();

当我执行此查询时,它会考虑所有Post模型,而不仅仅是最新的Post,并给出内部成员在任何帖子上发表评论的作者。

然而,在急切加载最新的PostPost查询时使用"用"功能,我只收到最新帖子的评论。

$author = Author::with('latestPost.comment')->get();

提前致谢。

1 个答案:

答案 0 :(得分:1)

如果您想要对帖子中没有created_by_internal = null条评论的作者进行统计,请使用whereDoesntHave()

Author::whereDoesntHave('latestPost.comment', function ($query) {
    $query->notCreatedByInternal();
})
->count();

在关系定义中,将外键放在id

之前
public function latestPost()
{
    return $this->hasOne('App\Post', 'latest_post_id', 'id')->latest();
}

另外,将范围更改为:

public scopeNotCreatedByInternal($query)
{
    return $query->whereNull('created_by_internal');
}