
本文介绍在 laravel 中通过控制器自动计算并存入“创建时间 + 7 天”作为过期日期(expired)字段的完整实现,涵盖验证、carbon 时间处理、数据合并及模型配置要点。
本文介绍在 laravel 中通过控制器自动计算并存入“创建时间 + 7 天”作为过期日期(expired)字段的完整实现,涵盖验证、carbon 时间处理、数据合并及模型配置要点。
在 Laravel 应用中,为记录自动设置相对有效期(如“创建后 1 周过期”)是常见需求。核心思路是:不在表单中暴露 expired 字段,而是在控制器中动态计算并注入该值到待入库数据中,确保逻辑安全、数据一致且符合业务规则。
✅ 正确实现步骤
首先,确认数据库 pasien 表已包含 expired 字段(类型建议为 DATE 或 DATETIME),并在 Pasien 模型中将其加入 $fillable 数组:
// app/Models/Pasien.php
protected $fillable = [
'nik', 'name', 'lahir', 'kelamin', 'poli', 'bayar', 'expired'
];
⚠️ 注意:类名必须首字母大写(Pasien 而非 pasien),这是 PHP PSR-4 规范与 Laravel 约定,否则可能导致自动加载失败或 IDE 识别异常。
其次,在 store 方法中,先执行验证,再动态追加 expired 值——关键在于将计算结果直接写入已验证的数据数组,而非单独声明变量后遗漏赋值:
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',
'poli' => 'required|string',
'bayar' => 'required|in:umum,bpjs,kis',
]);
// 2. 计算过期时间:以当前时间(非表单提交的 created_at)为准 + 1 周
// 注:表单未提交 created_at 字段,应使用 Carbon::now() 或 $request->date('lahir') 等可靠源
$validatedData['expired'] = Carbon::now()->addWeek(); // 推荐:使用 now()
// 3. 创建记录(自动包含 expired)
Pasien::create($validatedData);
return redirect('/dashboard/pasien')->with('success', 'Data pasien berhasil ditambahkan');
}
? 关键说明与优化建议
- 避免依赖未提交字段:原代码中 $request->created_at 在表单中并未定义,会导致 Carbon::parse() 报错或返回 null。应使用 Carbon::now()(推荐)或基于其他可信字段(如 lahir)推导,但业务上「过期 = 创建后 1 周」通常指服务器时间。
- 验证精简:expired 字段由后端生成,不应出现在 validate() 规则中,否则会因表单未提交而验证失败。
-
时间精度:addWeek() 默认精确到秒级;若只需日期(如 2025-04-05),可链式调用 ->toDateString():
$validatedData['expired'] = Carbon::now()->addWeek()->toDateString();
-
数据库迁移示例(如需添加字段):
php artisan make:migration add_expired_to_pasien_table
在迁移文件中:
$table->date('expired')->nullable(); // 或 datetime('expired')
✅ 总结
实现自动过期日期的核心是:验证 → 计算 → 注入 → 创建。全程无需修改前端表单,既保障了数据完整性,又提升了用户体验与系统安全性。务必确保模型 $fillable 包含目标字段,并严格遵守 Laravel 类命名规范——这不仅是代码风格问题,更是工程健壮性的基础。











