
本文讲解如何在 laravel 应用中,于数据创建时自动计算并存入“过期时间”(如创建时间 + 7 天),无需前端提交该字段,全程由后端控制,确保数据一致性与安全性。
本文讲解如何在 laravel 应用中,于数据创建时自动计算并存入“过期时间”(如创建时间 + 7 天),无需前端提交该字段,全程由后端控制,确保数据一致性与安全性。
在 Laravel 开发中,常需为记录动态生成时效性字段(如 expired_at),例如患者预约单默认有效期为创建后 7 天。这类逻辑不应依赖前端输入,而应在控制器中统一计算并注入,既提升安全性,又避免数据不一致风险。
✅ 正确实现方式:在验证后动态添加字段
首先,请确保数据库表中已存在 expired(或更规范的 expired_at)字段,且其类型为 DATETIME 或 TIMESTAMP。同时,在 Pasien 模型中将其加入 $fillable 数组:
// app/Models/Pasien.php
protected $fillable = [
'nik', 'name', 'lahir', 'kelamin', 'bayar', 'poli', 'expired_at'
];
⚠️ 注意:模型类名应遵循 PSR-4 规范,首字母大写(Pasien 而非 pasien),否则可能引发自动加载异常或 IDE 提示错误。
接着,在 store 方法中,先完成请求验证,再手动注入计算后的过期时间,最后统一创建记录:
use Illuminate\Http\Request;
use Carbon\Carbon;
use App\Models\Pasien; // 确保使用正确的命名空间和类名
public function store(Request $request)
{
// 1. 执行验证(注意:此处不要验证 'expired' 字段,它不由用户输入)
$validatedData = $request->validate([
'nik' => 'required|string|max:16',
'name' => 'required|string',
'lahir' => 'required|date',
'kelamin' => 'required|in:Laki-laki,Perempuan',
'bayar' => 'required|in:umum,bpjs,kis',
'poli' => 'required|string'
]);
// 2. 计算过期时间:以当前时间为基准(而非 $request->created_at,因该字段通常未提交)
// Laravel 默认会自动填充 created_at,因此我们直接使用 Carbon::now()
$validatedData['expired_at'] = Carbon::now()->addWeek();
// 3. 创建记录(自动包含 expired_at)
Pasien::create($validatedData);
return redirect('/dashboard/pasien')->with('success', 'Data pasien berhasil ditambahkan');
}
? 关键说明与最佳实践
- 不要依赖 $request->created_at:HTML 表单中并未提交 created_at 字段,强行解析会导致 Carbon::parse(null) 错误。应使用 Carbon::now() 获取真实创建时刻。
- 验证规则中移除 'expired' => 'required':该字段由服务端生成,不应要求用户输入,否则验证必然失败。
- 字段命名建议:使用 expired_at(带 _at 后缀)更符合 Laravel 时间戳命名惯例,便于 Eloquent 自动识别和处理。
- 时区安全:Carbon::now() 默认使用应用配置的时区(config/app.php 中的 'timezone'),确保服务器与业务时区一致。
✅ 额外优化:使用模型事件或自动访问器(进阶)
若需复用该逻辑,可将过期时间计算封装至模型的 creating 事件中:
// 在 Pasien 模型中
protected static function boot()
{
parent::boot();
static::creating(function ($pasien) {
$pasien->expired_at = Carbon::now()->addWeek();
});
}
这样控制器代码更简洁,且所有创建操作均自动生效。
通过以上方式,你既能保证过期时间准确、可控、不可篡改,又能保持代码清晰、可维护,并符合 Laravel 最佳实践。











