Laravel自定义表插入数据:如何将created_at设为当月1-30日
解决Laravel中循环插入日期范围记录的问题
嘿,你的代码逻辑方向是对的,主要是日期处理的方式出了问题,我给你两种靠谱的解决方案,帮你生成2018-04-01到2018-04-30的正确日期:
方法一:用Laravel自带的Carbon(推荐)
Laravel默认集成了Carbon日期库,用它处理日期超级省心,能彻底避免手动拼接字符串的错误:
use Carbon\Carbon; // 顶部引入Carbon,或者直接用\Carbon\Carbon $month = date('m'); $year = date('y'); $number = cal_days_in_month(CAL_GREGORIAN, $month, $year); // 定义当月的起始日期 $startDate = Carbon::create(2018, 4, 1); for ($i = 0; $i < $number; $i++) { $test = new Test(); $test->cuid = $user->id; $test->name = $user->name; $test->month = $month; // 复制起始日期并添加i天,自动生成每天的日期 $test->created_at = $startDate->copy()->addDays($i); $test->save(); }
Carbon不仅能自动处理日期格式,还支持时区、日期运算等功能,完全贴合Laravel的开发习惯,是最推荐的做法。
方法二:原生PHP字符串拼接
如果你不想用Carbon,也可以手动生成日期,但要注意两个关键点:
$month = date('m'); $year = date('y'); $number = cal_days_in_month(CAL_GREGORIAN, $month, $year); // 循环从1开始到当月天数,确保日期是1-30/31的有效范围 for ($i = 1; $i <= $number; $i++) { $test = new Test(); $test->cuid = $user->id; $test->name = $user->name; $test->month = $month; // 用sprintf补零,保证日期是01、02这样的两位数格式 $day = sprintf("%02d", $i); // PHP字符串拼接用`.`,不是`+`! $test->created_at = "2018-04-{$day}"; $test->save(); }
你原来代码的核心问题:
- 字符串拼接错误:PHP里字符串拼接用
.,+会把字符串强制转成数字计算,导致'2018-04-'+$i变成完全无效的日期; - 循环起始值问题:$i从0开始的话,生成的日期会是
2018-04-0,这是不存在的日期,必须调整为从1开始,或者用日期偏移的方式。
内容的提问来源于stack exchange,提问作者My testing
相关产品推荐
相关产品推荐

