如何基于关联模型访问量对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
相关产品推荐
相关产品推荐

