为何使用Query Builder的whereRaw方法无法实现字符串转日期查询?
解决Laravel查询中日期比较的
array_merge_recursive报错问题 错误原因
你遇到的array_merge_recursive(): Argument #2 must be of type array, string given错误,核心是查询构造器的参数传递格式不符合要求——当使用带占位符的原生表达式时,绑定的参数必须以数组形式传入,若直接传入单个字符串/Carbon对象(会被转为字符串),会触发底层数组合并的类型错误。
正确写法示例
1. 使用whereRaw的标准写法
确保将Carbon对象转换为数据库可识别的日期字符串,同时参数以数组形式传入:
// 仅比较日期部分(推荐,忽略时分秒) $query->whereRaw('STR_TO_DATE(validity, "%M %d, %Y") >= ?', [Carbon::today()->toDateString()]); // 需包含时分秒的完整时间比较 $query->whereRaw('STR_TO_DATE(validity, "%M %d, %Y") >= ?', [Carbon::now()->format('Y-m-d H:i:s')]);
2. 使用where配合DB::raw的正确写法
如果要使用DB::raw,需保证占位符的参数以数组形式传递,或者明确拆分运算符与值:
// 写法一:拆分运算符与参数 $query->where(DB::raw('STR_TO_DATE(validity, "%M %d, %Y")'), '>=', Carbon::today()->toDateString()); // 写法二:带占位符的参数绑定(需传入数组) $query->where(DB::raw('STR_TO_DATE(validity, "%M %d, %Y") >= ?'), [Carbon::today()->toDateString()]);
额外注意事项
- 优先使用
Carbon::today()获取当日日期(不含时分秒),避免因时分秒差异导致的筛选偏差; - 确认
validity字段的格式严格匹配"%M %d, %Y"(如January 3, 2024),否则STR_TO_DATE会返回NULL,导致比较结果不符合预期。
内容的提问来源于stack exchange,提问作者Nelson Castro
相关产品推荐
相关产品推荐

