如何从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
相关产品推荐
相关产品推荐

