当前位置:

laravel 软删除与表单唯一验证

本文最后更新于2022-08-18,已超过 1年没有更新,如果文章内容、图片或者下载资源失效,请留言反馈,我会及时处理,谢谢!

温馨提示:本文共3492个字,读完预计9分钟。

文章目录
  • laravel 软删除与表单唯一验证
  • 常规使用
  • 闭包方式
  • 中文文档

laravel 软删除与表单唯一验证

在laravel中表单唯一验证与软删除的使用

常规使用

写着方便,初学不好时理解起来有点困难
不知道大家看了官网上的讲解是什么感觉,反正我是一头雾水,我写了一下我自己的理解;
laravel 软删除与表单唯一验证-Mr.Li's Blog
laravel 软删除与表单唯一验证-Mr.Li's Blog

样式:unique:table,column,except,idColumn,key1,value1,key2,value2,key3,value3···keyn,valuen
例子:'email' => 'unique:users,email_address,'.$code.',serial'
table:表名(users)
column:数据库中存email的字段名email_address
except:排除主键值$code
idColumn:主键名,默认为id,当不是id时需要指明,如serial
value1,key2,value2,key3,value3···keyn,valuen:会转where条件
	注意value表示空要写成大写NULL,非空要也是大写NOT_NULL
转成sql大概意思就是这样
unique($table,$column,$except,$idColumn='id',key1,value1,key2,value2,key3,value3,...keyn,valuen){
	$num = DB::table($table)
	->where($idColumn,'<>',$except)
	->where('key1','=','value1')
	->where('key2','='.'value2')
	->where('key3','=','value3')
			.
			.
			.
	->where('keyn','=','valuen')
	->count($column);
	if($num>1){
		return false;
	}else{
		return true;
	}
}

laravel 软删除与表单唯一验证-Mr.Li's Blog
注意:value要表示为空时,必须写成NULL,必须写成NULL,必须写成NULL,
注意:value要表示不为空时,必须写成NOT_NULL,必须写成NOT_NULL,必须写成NOT_NULL,
相信通过上面的例子应该是清楚unique的用法了,我通常喜欢用deleted_at是否为空来判断此数据是否被删除,这里有个坑,小心了,NULL必须是全部大写的NULL,否则null会被当成字符串来处理

#错误
'email_address'=>"unique:users,email_address,$selfId,id,deleted_at,null",
#错误
'email_address'=>"unique:users,email_address,$selfId,id,deleted_at,Null",
#正确
'email_address'=>"unique:users,email_address,$selfId,id,deleted_at,NULL",

如果你用的是Request写法,这里需要结合你的路由来设置,比如你的路由是这样的
以修改为例:
用uuid查询出数据并修改name

Route::put('sites/update/{uuid}', 'SitesController@update')->name('conf.sites.update');

传递了uuid作为查询主键,那么你的验证规则就应该这样写

验证规则
'name'  => 'unique:users(你验证的表名称users),name(你要排除的字段名称name),'.$this->uuid(你路由中传递的变量uuid).',uuid(你的主键名称uuid)',
'name'  => 'unique:users,name,'.$this->uuid.',uuid',
//注意了,你路由中用abc接收变量,你这里就写成$this->abc
//Route::put('sites/update/{uuid}', 'SitesController@update')->name('conf.sites.update');
//'name'  => 'unique:users,name,'.$this->abc.',uuid',

看到这里你是不是要问,我艹$this->abc是什么鬼,怎么就能拿到我们传递的值?要是不放心,可以在你的Request中逐步打印一下,或是写成下面的样式,详情去看获取路由参数的方法

dd($this);
dd($this->route());
dd($this->route()->parameters);
dd($this->route()->parameters['abc']);
dd($this->route('abc'));
//就这种
'name'  => 'unique:users,name,'.$this->route('abc').',uuid',

laravel 软删除与表单唯一验证-Mr.Li's Blog

闭包方式

容易理解,写着复杂

#引一下
use Illuminate\Validation\Rule;
 'email' =>[
     'required',
     'Max:120',
     Rule::unique('stands')->where(function ($query) use($id) {
         $query->where('deleted_at', null)->where('id','<>',$id);
     })
 ],
 注意:闭包方式=》后必须用数组[]来存,不能用“|”的方式

中文文档

下面这是文档里复制出来的关于唯一性验证的讲解

unique:table,column,except,idColumn
在指定的数据表中,验证字段必须是唯一的。如果没有指定 column,将会使用字段本身的名称。

指定一个特定的字段名称:

'email' => 'unique:users,email_address'
自定义数据库连接

有时候你可能需要自定义一个连接,来通过 Validator 对数据库进行查找。如上面所示,设置 unique:users 作为验证规则,通过默认数据库连接来做数据库查找。如果要重写验证规则,可在指定的连接的表单名称后面加上「.」:

'email' => 'unique:connection.users,email_address'
强迫 Unique 规则忽略指定 ID:

有时候,你希望在验证字段时对指定 ID 进行忽略。例如,在「更新个人资料」页面会包含用户名、邮箱等字段。这时你会想要验证更新的 e-mail 值是否为唯一的。如果用户仅更改了名称字段而不是 e-mail 字段,就不需要抛出验证错误,因为此用户已经是这个 e-mail 的拥有者了。假设用户提供的 e-mail 已经被其他用户使用,则需要抛出验证错误。若要用指定规则来忽略用户 ID,则应该把要发送的 ID 当作第三个参数:

'email' => 'unique:users,email_address,'.$user->id
如果你的数据表使用的主键名称不是 id,那么你可以在第四个参数中来指定它:

'email' => 'unique:users,email_address,'.$user->id.',user_id'
增加额外的 Where 语句:

你也可以指定更多的条件到「where」查询语句:

'email' => 'unique:users,email_address,NULL,id,account_id,1'
上述规则中,只有 account_id 为 1 的数据列会被包含在 unique 规则的验证。
  •  
本文链接:,转发请注明来源!
评论已关闭。