laravel表单验证的exists、unique去除软删除字段的校验

简介: 虽然Laravel的验证系统非常强大和灵活,但在处理软删除数据时仍需要特别注意。通过正确使用验证规则,并在需要时创建自定义验证规则,你可以确保应用的数据验证既准确又高效。记得在对 `unique`和 `exists`规则进程自定义时,清晰地注明你排除软删除记录的意图,这将使得代码更容易理解和维护。

在开发Laravel应用时,表单验证是确保数据完整性和安全性的关键步骤之一。Laravel提供了强大灵活的验证规则,其中 existsunique是用于检查数据库中数据存在性和唯一性的常用验证规则。不过,当我们的数据模型使用了软删除功能(即使用 SoftDeletes)时,使用这些验证规则默认会包含软删除的记录,这在某些场景下并不是我们所期望的。因此,我们需要对这些规则进行自定义扩展,以排除软删除的记录。

软删除概览

在Laravel中,使用 SoftDeletes能使得模型在被删除时,并不真正从数据库中移除,而是设置了一个 deleted_at字段来标记该记录已被软删除。查询软删除模型时,默认不会包含这些已标记为软删除的记录。

exists 验证去除软删除字段的校验

当你使用 exists规则进行数据验证时,如果想要排除软删除的数据,可以通过自定义查询条件来实现。

// 假设我们验证 users 表中的 email 字段,但要排除软删除的记录
'required|email|exists:users,email,NULL,id,deleted_at,NULL'

在这个规则中,exists的基本语法是 exists:table,column,except,column,value,...,我们在最后添加了 deleted_at,NULL这个条件,这样就能排除那些 deleted_at列不为 NULL(即已软删除)的记录。

unique 验证去除软删除字段的校验

相对于 exists规则,unique规则的调整稍微有一点不同,因为 unique规则主要用于确保数据库表中指定字段值的唯一性,如果需要排除软删除记录,我们同样需要自定义查询条件。

// 假设我们在 users 表中验证 email 字段的唯一性,同时要排除软删除的记录
'email|unique:users,email,NULL,id,deleted_at,NULL'

在这个 unique规则中,我们通过在条件中指定 deleted_at,NULL来忽略软删除的数据。

自定义验证规则

如果你发现你需要频繁在验证规则中排除软删除的记录,可以考虑定义自定义验证规则,这能使代码更加整洁、复用性更高。

AppServiceProvider或者专门的 ValidationServiceProvider中,你可以使用 Validator::extend方法来扩展自定义验证规则。例如,你可以定义一个名为 unique_without_trashed的规则。

use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Validator;

class ValidationServiceProvider extends ServiceProvider
{
    public function boot()
    {
        Validator::extend('unique_without_trashed', function ($attribute, $value, $parameters, $validator) {
            // 自定义验证逻辑
        });
    }
}

在这个自定义验证中,你可以通过Laravel的查询构造器或Eloquent来实现排除软删除记录的唯一性检查逻辑。

总结

虽然Laravel的验证系统非常强大和灵活,但在处理软删除数据时仍需要特别注意。通过正确使用验证规则,并在需要时创建自定义验证规则,你可以确保应用的数据验证既准确又高效。记得在对 uniqueexists规则进程自定义时,清晰地注明你排除软删除记录的意图,这将使得代码更容易理解和维护。

目录
相关文章
|
9月前
|
前端开发
Antd中Table列表行默认包含修改及删除功能的封装
Antd中Table列表行默认包含修改及删除功能的封装
221 0
|
9月前
|
数据格式
Layui中table数据表格使用方法渲染 返回的数据不符合规范,正确的成功状态码应为:“code“: 0异常处理
Layui中table数据表格使用方法渲染 返回的数据不符合规范,正确的成功状态码应为:“code“: 0异常处理
1011 0
|
前端开发 API Python
DRF自定义错误异常替换detail信息
因为自己写api定义了一套格式,但是django rest_framework的异常提醒又跟我的不一样, 要么是:
68 2
|
9月前
|
SQL 存储 Java
MyBatis【付诸实践 02】 mapper文件未编译+statementType使用+返回结果字段顺序不一致+获取自增ID+一个update标签批量更新记录
MyBatis【付诸实践 02】 mapper文件未编译+statementType使用+返回结果字段顺序不一致+获取自增ID+一个update标签批量更新记录
102 0
|
PHP 数据库
thinkphp 获取数据库中的表名并去除黑名单
thinkphp 获取数据库中的表名并去除黑名单
102 0
|
设计模式 数据库
Access2016删除主键列(图文操作)错误提示:若要删除主键,请在“设计”视图中打开该表并删除主键字段
Access2016删除主键列(图文操作)错误提示:若要删除主键,请在“设计”视图中打开该表并删除主键字段
Access2016删除主键列(图文操作)错误提示:若要删除主键,请在“设计”视图中打开该表并删除主键字段
|
JavaScript
js里校验数组中的某个字段是否重复?
js里校验数组中的某个字段是否重复?
165 0
|
前端开发 PHP
TP5 使用strip_tags过滤html标签不起作用的解决方法
TP5 使用strip_tags过滤html标签不起作用的解决方法
302 0
|
JSON JavaScript 数据格式
VUE element-ui之jspreadsheet-ce在线表格数据json序列化(excel数据同步为相应key:value,并过滤掉为空的数据,未输入的行)
VUE element-ui之jspreadsheet-ce在线表格数据json序列化(excel数据同步为相应key:value,并过滤掉为空的数据,未输入的行)
615 0
VUE element-ui之jspreadsheet-ce在线表格数据json序列化(excel数据同步为相应key:value,并过滤掉为空的数据,未输入的行)
Document字段发生变化后,报的错
2016-10-11 15:27:47,828 [ERROR] [main] SpringApplication:838 - Application startup failedorg.springframework.
1978 0