在 Laravel 中,withCount()
方法用于在 Eloquent 关系中添加一个计数器,以便在查询时获取关联模型的数量。如果你想要对多个关联模型进行计数,并且对这些计数进行求和以及排序,你可以使用子查询或者 DB facade 来实现。
以下是一个示例,假设我们有一个 Post
模型,它有两个关联模型 Comment
和 Like
,我们想要获取每个帖子的评论数和点赞数的总和,并按照这个总和进行排序。
use App\Models\Post;
use Illuminate\Support\Facades\DB;
$posts = Post::select('posts.*', DB::raw('
(SELECT COUNT(*) FROM comments WHERE comments.post_id = posts.id) +
(SELECT COUNT(*) FROM likes WHERE likes.post_id = posts.id) AS total_interactions
'))
->orderBy('total_interactions', 'desc')
->get();
在这个例子中,我们使用了两个子查询来分别计算每个帖子的评论数和点赞数,然后将它们相加得到 total_interactions
字段,并按照这个字段进行降序排序。
如果你想要使用 withCount()
方法,你可以先获取所有帖子及其关联计数,然后在内存中进行排序。这种方法可能不适合大数据集,因为它会将所有数据加载到内存中。
use App\Models\Post;
$posts = Post::withCount(['comments', 'likes'])
->get()
->sortByDesc(function ($post) {
return $post->comments_count + $post->likes_count;
});
在这个例子中,我们首先使用 withCount()
方法获取所有帖子的评论数和点赞数,然后使用 sortByDesc()
方法在内存中对结果进行排序。
withCount()
方法时,如果关联模型有额外的 where 条件,需要使用 ->whereHas()
方法来指定这些条件。以上两种方法都可以实现你的需求,选择哪一种取决于你的具体场景和性能考虑。
领取专属 10元无门槛券
手把手带您无忧上云