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

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');
}

额外注意事项

  1. 建议将模型类名首字母小写的pasien改为大写Pasien,符合Laravel命名规范,避免类加载异常。同时确认模型的批量赋值白名单$fillable中已经加入expired字段,否则Laravel会拦截该字段的写入,参考配置如下:
// 文件路径:app/Models/Pasien.php
protected $fillable = [
    'nik',
    'name',
    'kelamin',
    'lahir',
    'bayar',
    'poli',
    'expired', // 新增该行
];
  1. 如果expired字段在数据库中是日期类型,可以在模型中加入$casts配置,自动转换为Carbon实例方便后续操作:
protected $casts = [
    'expired' => 'datetime',
];

可选优化:如果后续其他业务入口也需要自动计算该字段,可以在模型的creating钩子中统一填充到期日逻辑,避免重复写相同代码,当前场景直接用上述合并数组的方式即可满足需求。

内容的提问来源于stack exchange,提问作者arif

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 21:21:26