Laravel中从数据库date列获取唯一年月列表的其他实现方式
替代方案:获取格式化后的唯一年月值
以下是几种基于Eloquent或集合的实现方式,能直接得到YYYY-MM格式的唯一年月列表:
1. 数据库层面直接格式化(推荐)
直接在查询时用数据库函数拼接成目标格式,再提取结果,性能最优:
SubjectReport::selectRaw("DATE_FORMAT(date, '%Y-%m') as year_month") ->distinct() ->pluck('year_month');
执行后返回的集合直接包含2023-01、2023-02这类字符串,遍历即可输出目标格式。
2. 集合层面处理日期
先取出原始日期,再通过集合的map方法格式化,最后去重:
SubjectReport::select(['date']) ->distinct() ->get() ->map(fn($item) => $item->date->format('Y-m')) ->unique();
适合需要对日期做额外逻辑处理的场景,注意要确保date字段在模型中被定义为日期类型(通过$dates属性或cast配置)。
3. 用GROUP_BY替代DISTINCT
和第一种逻辑类似,用groupBy实现去重效果:
use Illuminate\Support\Facades\DB; SubjectReport::select(DB::raw("DATE_FORMAT(date, '%Y-%m') as year_month")) ->groupBy('year_month') ->pluck('year_month');
groupBy和distinct在这个场景下效果一致,可根据个人习惯选择。
内容的提问来源于stack exchange,提问作者mahbub
相关产品推荐
相关产品推荐

