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

如何从Laravel的datetime字段中获取去重的日期部分

解决方案

方案一:利用Laravel集合链式操作(推荐)

你可以用Laravel集合的map方法替代foreach循环,结合unique和values实现需求,写法类似Python的lambda表达式(PHP 7.4+支持箭头函数):

情况1:Game模型已配置日期自动转换

如果你的Game模型里已经把valid_upto加入到$dates属性(Laravel会自动将该字段转为Carbon实例):

// Game模型内的配置
protected $dates = ['valid_upto'];

查询代码可简化为:

$dates = Game::where('week', $this->week)
    ->distinct('valid_upto')
    ->pluck('valid_upto')
    ->map(fn($date) => $date->toDateString()) // 提取日期部分
    ->unique() // 去重
    ->values(); // 重置数组连续索引

情况2:模型未配置自动转换

若模型没做自动转换,直接用Carbon解析日期字符串即可:

$dates = Game::where('week', $this->week)
    ->distinct('valid_upto')
    ->pluck('valid_upto')
    ->map(function ($dateStr) {
        return \Carbon\Carbon::parse($dateStr)->toDateString();
    })
    ->unique()
    ->values();

方案二:ORM层面直接获取去重日期(兼容多数据库)

如果想在数据库查询阶段完成日期提取和去重,又不想硬编码数据库原生函数,可以用Laravel的DB::raw(框架会自动适配不同数据库语法):

$dates = Game::where('week', $this->week)
    ->select(DB::raw('DATE(valid_upto) as date'))
    ->distinct()
    ->pluck('date');

这个方法直接从数据库返回去重后的日期字符串,无需后续集合处理,性能更优。

原方案的问题

你之前的foreach+explode写法需要手动修改集合元素,而Laravel集合的链式操作更简洁可读,也符合框架的设计风格。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 19:45:21