如何在Laravel中防止空数据插入数据库
如何在Laravel中防止空数据插入数据库?
部分场景下会出现数据作为空记录被保存到数据库的问题,示例如下:
可以通过以下几种方案实现空数据拦截:
- 请求层表单验证
Laravel 自带的验证器支持通过required规则强制字段非空,验证不通过会自动抛出错误,不会进入后续数据写入逻辑。示例代码:
// 控制器中写入数据前先做验证 $validated = $request->validate([ 'name' => 'required|string|max:100', 'mobile' => 'required|numeric', 'email' => 'required|email', ]); // 验证通过后仅使用校验后的合法数据写入 User::create($validated);
- 数据库迁移加非空约束
在创建表的迁移文件中给必填字段加上nullable(false)属性,从数据库底层禁止空值写入,即使代码逻辑遗漏校验,数据库也会抛出异常拦截非法写入。示例代码:
Schema::create('users', function (Blueprint $table) { $table->id(); $table->string('name')->nullable(false); $table->char('mobile', 11)->nullable(false); $table->string('email')->nullable(false); $table->timestamps(); });
- 过滤空输入参数
写入前先对请求参数做过滤,剔除掉值为null、空字符串的字段,避免无效空值被传入写入方法:
// 过滤所有空值后再写入 $filterData = array_filter($request->all(), function ($value) { return !is_null($value) && trim((string)$value) !== ''; }); User::create($filterData);
- 模型层保存前拦截
利用模型的saving事件钩子,在数据保存前做非空校验,如果必填字段为空直接终止保存操作:
// 在对应模型中添加saving事件监听 protected static function booted() { static::saving(function ($model) { // 校验必填字段非空 if (trim($model->name) === '' || trim($model->mobile) === '') { return false; // 终止本次保存 } }); }
通常建议多层级搭配使用,请求层做用户输入校验,数据库层做兜底拦截,避免出现空数据写入问题。
内容的提问来源于stack exchange,提问作者Athira Das
相关产品推荐
相关产品推荐

