Laravel 来自同一模型的多个模型的计数关系

Laravel 来自同一模型的多个模型的计数关系,laravel,Laravel,我有以下三种模型:用户、帖子和评论。一个用户可以有多篇文章,每篇文章可以有多条评论 我想做的是: 获取属于特定用户的所有帖子中所有评论的计数 获取属于同一用户的所有帖子本月所有评论的计数 起始点是一个特定的Post by ID(因此不是从用户ID开始) 下面是我现在拥有的,这很有效 我的问题是:是否可以将最后两行doing->sum()添加到查询中 我认为这个查询已经很漂亮了,但它看起来会更好,但更重要的是,如果最后两行也包括在内,它将使缓存变得更容易 $post = Post::findO

我有以下三种模型:用户、帖子和评论。一个用户可以有多篇文章,每篇文章可以有多条评论

我想做的是:

  • 获取属于特定用户的所有帖子中所有评论的计数
  • 获取属于同一用户的所有帖子本月所有评论的计数
  • 起始点是一个特定的Post by ID(因此不是从用户ID开始)
下面是我现在拥有的,这很有效

我的问题是:是否可以将最后两行doing->sum()添加到查询中

我认为这个查询已经很漂亮了,但它看起来会更好,但更重要的是,如果最后两行也包括在内,它将使缓存变得更容易

$post = Post::findOrFail($id);

$posts = Post::where('user_id', $post->user_id)
        ->withCount(['comments as comments_total'])
        ->withCount([
            'comments as comments_this_month' => function ($q) {
                $q->whereBetween('created_at',
                    [ Carbon::now()->startOfMonth(), Carbon::now()->endOfMonth() ]
                );
            },
        ])->get();
});

$comments_this_month_count = $posts->sum('comments_this_month');
$comments_total_count = $posts->sum('comments_total');

我只需要两行代码就可以提出更好的解决方案

用户
模型中定义
hasManyThrough
关系:

public function comments()
{
    return $this->hasManyThrough(
        Comment::class,
        Post::class,
        'user_id', // Foreign key on posts table...
        'post_id' // Foreign key on comments table...
    );
}
那么就这样称呼它:

$comments_this_month_count = User::find($post->user_id)->comments()
->whereMonth('created_at', now()->month)->count();

$comments_total_count = User::find($post->user_id)->comments()->count();

我只需要两行代码就可以提出更好的解决方案

用户
模型中定义
hasManyThrough
关系:

public function comments()
{
    return $this->hasManyThrough(
        Comment::class,
        Post::class,
        'user_id', // Foreign key on posts table...
        'post_id' // Foreign key on comments table...
    );
}
那么就这样称呼它:

$comments_this_month_count = User::find($post->user_id)->comments()
->whereMonth('created_at', now()->month)->count();

$comments_total_count = User::find($post->user_id)->comments()->count();

使用
HasManyThrough
是个好主意。虽然现在我仍然有两行代码用于两次计数,就像现在一样。如果我能将它们放在一个查询中,缓存起来会更容易,尽管我可能无论如何都要增加这些计数。使用
HasManyThrough
是个好主意。虽然现在我仍然有两行代码用于两次计数,就像现在一样。如果我能把它们放在一个查询中,缓存起来会更容易,尽管我可能无论如何都要增加这些计数。