[英]Laravel 5.6 - update unique attribute
我有一个名为 JuridicoFormRequest 的表单请求,其方法为“规则”:
public function rules() {
$rules = [
'rif'=>'required|max:40|unique:juridico,rif',
'correo'=>'required|max:40|unique:juridico,correo',
'd_social'=>'required|max:50',
'r_social'=>'required|max:50',
'pagina_web'=>'max:40|unique:juridico,pagina_web',
'capital'=>'required|numeric',
'fk_lugar'=>'required|integer',
'fk_lugar_fiscal'=>'required|integer',
'fk_tienda'=>'integer',
'num_carnet'=>'max:50'
];
if ($this->juridico){
$rules['rif'] = 'required|max:40';
$rules['correo'] = 'required|max:40';
$rules['pagina_web'] = 'required|max:40';
}
return $rules;
}
问题是在数据库中,“Correo”属性必须是唯一的,“pagina_web”也是如此。 当我尝试更新某个注册表“A”并编写另一个注册表“B”的相同“Correo”或另一个注册表的相同“pagina_web”时,会引发错误。 “rif”不会发生这种情况,因为它是主键,我已经使用以下方法对其进行了验证:
if ($this->juridico) { /*....*/ }
如果我做:
if ($this->juridico) {
$rules['rif'] = 'required|max:40';
$rules['correo'] = 'required|max:40|unique:juridico,correo';
$rules['pagina_web'] = 'required|max:40|unique:juridico,pagina_web';
}
向我抛出验证消息(不是例外)“correo 必须是唯一的”,而“correo”和“pagina_web”已经被我正在更新的注册表采用。
有没有办法解决这个问题?
更新:我是这样解决的:
public function rules(){
$rules = [
'rif'=>'required|max:40|unique:juridico,rif',
'correo'=>'required|max:40|unique:juridico,correo',
'd_social'=>'required|max:50',
'r_social'=>'required|max:50',
'pagina_web'=>'max:40|unique:juridico,pagina_web',
'capital'=>'required|numeric',
'fk_lugar'=>'required|integer',
'fk_lugar_fiscal'=>'required|integer',
'fk_tienda'=>'integer',
'num_carnet'=>'max:50'
];
if ($this->juridico){
$rules['rif'] = 'required|max:40';
$rules['correo'] = 'required|max:40|unique:juridico,correo,'.$this->juridico.',rif';
$rules['pagina_web'] = 'required|max:40|unique:juridico,pagina_web,'.$this->juridico.',rif';
}
return $rules;
}
use Illuminate\Validation\Rule;
Validator::make($data, [
'email' => [
'required',
Rule::unique('users')->ignore($user->id),
],
]);
如果您的表使用了 id 以外的主键列名,您可以在调用 ignore 方法时指定列名:
'email' => Rule::unique('users')->ignore($user->id, 'user_id')
你可以定制它!
请参阅文档https://laravel.com/docs/5.5/validation#rule-unique
$rules['correo'] = 'required|max:40|unique:juridico,correo,pagina_web';
或者
$rules['correo'] = [
'required',
'max:40',
Rule::unique('juridico')->where(function ($query) use ($paginaWeb) {
return $query->where('pagina_web', $paginaWeb);
})
];
在 AppServiceProvider 添加这个
public function boot()
{
Validator::extend('uniq', function ($attribute, $value, $parameters, $validator) {
$data = $validator->getData();
$tableName = $parameters[0];
unset($parameters[0]);
$primaryKey = 'id';
$query = DB::table($tableName);
// set main uniqueness condition
$query->where($attribute, '=', $value);
// if primary key exists - set to NOT be equal (for updating case)
if (!empty($data[$primaryKey])) {
$query->where($primaryKey, '!=', $data[$primaryKey]);
}
// check conditional columns
if (!empty($parameters)) {
foreach ($parameters as $column) {
if (isset($data[$column])) {
$query->where($column, '=', $data[$column]);
}
}
}
$count = $query->count();
return ($count == 0) ? true : false;
});
}
和用法
$rules['correo'] = 'required|max:40|uniq:juridico,correo,pagina_web';
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.