Laravel Eloquent如何根据日期数组匹配created_at查询CLICK模型数据
解决Laravel中CLICK模型按指定日期数组匹配created_at的问题
核心问题是数组里的日期格式(m/d/Y)和created_at的datetime格式不匹配,直接用whereIn会因为格式不对查不到数据,解决思路是统一两边的日期格式,以下是两种可行方案:
方案一:转换日期数组为数据库兼容格式,配合whereIn和日期提取
先把数组中的每个日期转换为Y-m-d格式(数据库存储的标准日期格式),再通过DATE()函数提取created_at的日期部分进行匹配:
$dates = ['09/08/2022', '09/16/2022', '03/08/2022']; // 转换数组内的日期格式为Y-m-d $formattedDates = array_map(function($date) { return \Carbon\Carbon::createFromFormat('m/d/Y', $date)->toDateString(); }, $dates); // 查询匹配的点击数据 $clicks = \App\Models\Click::whereIn(\Illuminate\Support\Facades\DB::raw('DATE(created_at)'), $formattedDates)->get();
方案二:使用orWhereDate循环匹配每个日期
如果不想提前处理数组格式,可以循环日期数组,逐个添加orWhereDate条件:
$dates = ['09/08/2022', '09/16/2022', '03/08/2022']; $query = \App\Models\Click::query(); foreach ($dates as $date) { $carbonDate = \Carbon\Carbon::createFromFormat('m/d/Y', $date); $query->orWhereDate('created_at', $carbonDate); } $clicks = $query->get();
注意事项
- 确保Carbon的时区配置和数据库时区一致,避免日期转换出现偏差
- 第一种方案性能更优,因为只生成一条
IN查询;第二种方案会生成多个OR条件,数据量大时优先选方案一
内容的提问来源于stack exchange,提问作者Murtaja Ahmed Noyeem
相关产品推荐
相关产品推荐

