Eloquent关联查询中plays表按日期统计播放量逻辑不生效问题排查
故障原因
- 关联预加载自定义查询时未选择关联外键:
plays表与songs表的关联依赖外键(通常为song_id),你在闭包内的select方法中仅指定了统计字段和日期字段,未包含关联外键,Laravel无法将查询到的播放统计数据和对应歌曲做关联匹配,因此最终返回的关联属性为空。 - 分组规则缺失:你当前的分组仅按日期分组,统计的是全局播放量,若你需要的是单首歌曲按日期的播放量统计,分组规则需要额外加上外键字段,否则统计结果不会拆分到对应歌曲下。
修改后的代码
$artist->songs()->with(['plays' => function($q){ // 新增关联外键song_id到选择字段中 $q->select('song_id', \DB::raw('COUNT(*) as plays'), \DB::raw('DATE(created_at) as date')) ->whereDate('created_at', '>', \Carbon\Carbon::now()->subWeek()) // 新增外键到分组规则 ->groupBy('song_id', 'date') ->orderBy('date'); }])->get()->pluck('plays')->toArray();
补充说明
如果你需要的是该歌手所有歌曲近一周的总播放量统计(不需要拆分到单首歌曲),不需要用关联预加载实现,直接从Play表关联songs表查询性能更高:
Play::select(\DB::raw('COUNT(*) as plays'), \DB::raw('DATE(created_at) as date')) ->whereIn('song_id', $artist->songs()->pluck('id')) ->whereDate('created_at', '>', \Carbon\Carbon::now()->subWeek()) ->groupBy('date') ->orderBy('date') ->get() ->toArray();
内容的提问来源于stack exchange,提问作者Adm Nopil
相关产品推荐
相关产品推荐

