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

为何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 01:37:08