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规则进程自定义时,清晰地注明你排除软删除记录的意图,这将使得代码更容易理解和维护。

目录
相关文章
|
4月前
|
数据格式
Layui中table数据表格使用方法渲染 返回的数据不符合规范,正确的成功状态码应为:“code“: 0异常处理
Layui中table数据表格使用方法渲染 返回的数据不符合规范,正确的成功状态码应为:“code“: 0异常处理
619 0
|
3月前
|
关系型数据库 MySQL PHP
【thinkphp知识】thinkphp 使用union链式操作合并两个或多个 SELECT 语句的结果集,新增不存在的字段,并赋予默认值
【thinkphp知识】thinkphp 使用union链式操作合并两个或多个 SELECT 语句的结果集,新增不存在的字段,并赋予默认值
36 0
|
SQL Oracle 关系型数据库
gt-checksum 1.2.1发布,新增表结构校验及修复等超实用特性
gt-checksum 1.2.1发布,新增表结构校验及修复等超实用特性
|
PHP 数据库
thinkphp 获取数据库中的表名并去除黑名单
thinkphp 获取数据库中的表名并去除黑名单
74 0
|
存储 数据库
laravel-admin 查询过滤时间戳(数据库使用int类型)不起作用案例复现及解决办法
laravel-admin 查询过滤时间戳(数据库使用int类型)不起作用案例复现及解决办法
258 0
laravel-admin 查询过滤时间戳(数据库使用int类型)不起作用案例复现及解决办法
|
设计模式 数据库
Access2016删除主键列(图文操作)错误提示:若要删除主键,请在“设计”视图中打开该表并删除主键字段
Access2016删除主键列(图文操作)错误提示:若要删除主键,请在“设计”视图中打开该表并删除主键字段
Access2016删除主键列(图文操作)错误提示:若要删除主键,请在“设计”视图中打开该表并删除主键字段
|
PHP 数据库
Laravel模型更改时间戳列名称
Laravel模型更改时间戳列名称
105 0
|
JSON 测试技术 API
使用Wisdom RESTClient进行自动化测试,如何取消对返回的body内容的校验?对排除的JSON属性字段不做校验?
使用Wisdom RESTClient进行自动化测试,如何取消对返回的body内容的校验?对排除的JSON属性字段不做校验?
1207 0
|
PHP
Laravel返回不重复的某个字段信息列表
->groupBy('brand_id') ->pluck('brand_id');  学习交流群:364976091
1921 0