You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于关联模型访问量对Laravel的Story模型排序?

解决Laravel中按关联模型的关联总访问量排序Story的问题

你的问题出在:嵌套的withCount只会给每个Episode单独统计访问量,不会自动将所有Episode的访问量求和后关联到Story上。要实现按所有Episode的总访问量排序,你可以用以下两种方法:

方法一:使用withCount结合子查询求和

直接在Story的withCount中通过子查询计算所有关联Episode的访问量总和:

use Illuminate\Support\Facades\DB;
use App\Models\Episode;

$stories = Story::withCount([
    'episodes as total_visits' => function ($query) {
        $query->select(DB::raw('count(visits.id)'))
            ->leftJoin('visits', function ($join) {
                $join->on('visits.visitable_id', '=', 'episodes.id')
                     ->where('visits.visitable_type', '=', Episode::class);
            });
    }
])
->orderByDesc('total_visits')
->get();

这里通过leftJoin关联visits表,利用count(visits.id)统计所有关联Episode的访问总量,并将这个值命名为total_visits,最后按这个字段倒序排序。

方法二:使用关联表Join结合分组统计

通过直接关联episodes和visits表,分组后统计总访问量:

use Illuminate\Support\Facades\DB;
use App\Models\Episode;

$stories = Story::select('stories.*', DB::raw('count(visits.id) as total_visits'))
    ->leftJoin('episodes', 'episodes.story_id', '=', 'stories.id')
    ->leftJoin('visits', function ($join) {
        $join->on('visits.visitable_id', '=', 'episodes.id')
             ->where('visits.visitable_type', '=', Episode::class);
    })
    ->groupBy('stories.id')
    ->orderByDesc('total_visits')
    ->get();

这种方式通过三层表关联,分组统计每个Story对应的所有访问记录数,同样实现按总访问量排序的需求。

注意:如果你的Laravel版本开启了严格模式,需要确保groupBy包含stories表的所有字段,或者在select中明确列出stories的所有字段代替stories.*。

内容的提问来源于stack exchange,提问作者3m1n3nc3

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 05:55:01