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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 14:36:05