Laravel如何将创建日期计算的自动到期日期写入数据库
问题修复方案
你的代码存在3个核心问题,按如下步骤修改即可实现自动填充到期时间入库:
- 校验规则错误:
expired是后端计算生成的字段,前端表单不会提交该参数,不能加required校验规则,否则会直接报参数缺失错误 - 取值逻辑错误:新提交的请求实例中不存在
created_at字段,直接取当前服务器时间作为创建时间基准即可 - 参数未合并:计算得到的
$expiry_day没有加入到批量赋值的数据数组中,create方法无法获取该值
修正后的控制器代码
public function store(Request $request) { // 直接取当前时间加1周得到到期日,无需从请求中读取created_at $expiry_day = now()->addWeek(); // 移除expired字段的required校验 $validateData = $request->validate([ 'nik' => 'required', 'name' => 'required', 'kelamin' => 'required', 'lahir' => 'required', 'bayar' => 'required', 'poli' => 'required', ]); // 将计算得到的到期日追加到验证通过的数据中,绑定到expired字段 $validateData['expired'] = $expiry_day; Pasien::create($validateData); return redirect('/dashboard/pasien')->with('success','Data pasien berhasil ditambahkan'); }
额外注意事项
- 建议将模型类名首字母小写的
pasien改为大写Pasien,符合Laravel命名规范,避免类加载异常。同时确认模型的批量赋值白名单$fillable中已经加入expired字段,否则Laravel会拦截该字段的写入,参考配置如下:
// 文件路径:app/Models/Pasien.php protected $fillable = [ 'nik', 'name', 'kelamin', 'lahir', 'bayar', 'poli', 'expired', // 新增该行 ];
- 如果
expired字段在数据库中是日期类型,可以在模型中加入$casts配置,自动转换为Carbon实例方便后续操作:
protected $casts = [ 'expired' => 'datetime', ];
可选优化:如果后续其他业务入口也需要自动计算该字段,可以在模型的
creating钩子中统一填充到期日逻辑,避免重复写相同代码,当前场景直接用上述合并数组的方式即可满足需求。
内容的提问来源于stack exchange,提问作者arif
相关产品推荐
相关产品推荐

