Laravel:更新和创建时验证唯一
Posted
技术标签:
【中文标题】Laravel:更新和创建时验证唯一【英文标题】:Laravel: Validation unique when update and create 【发布时间】:2018-07-17 21:38:06 【问题描述】:我有一个请求,其中包含我验证一个字段是否唯一的规则。
当我使用时:
'cod_upb' => 'required|max:10|unique:equipos,cod_upb,'.$this->id,
它在 create 方法中有效,因为它不允许我重复数据库中的字段。但是当我尝试更新时,它说该字段已经存在或被占用。
然后我尝试了:
'cod_upb' => 'required|max:10|unique:equipos,id,'.$this->id,
这适用于更新,但它让我可以创建重复该字段的新项目。
我该如何解决这个问题?
【问题讨论】:
我的主键是一个名为“id”的字段,它是mysql中的一个自增字段 $this->id 代表什么? 【参考方案1】:解决办法如下:
用于创建:
public function controllerName(Request $request, $id)
$this->validate($request, [
"form_field_name" => 'required|unique:db_table_name,db_table_column_name'
]);
// the rest code
更新:
public function anotherControllerName(Request $request, $id)
$this->validate($request, [
"form_field_name" => 'required|unique:db_table_name,db_table_column_name,'.$id
]);
// the rest code
就是这样。快乐编码:)
【讨论】:
【参考方案2】:您正在检查更新时的唯一性错误。您正在对照 id 字段而不是 cod_upb 字段检查它。
$this->id
应该重命名为 $equiposId
。确保$this->id
是代表数据库中equipos
记录的ID。
改变这个:
'cod_upb' => 'required|max:10|unique:equipos,id,'.$this->id,
到这里:
'cod_upb' => 'required|max:10|unique:equipos,cod_upb,'.$this->id,
在 laravel 5.5 上
'cod_upb' => Rule::unique('equipos')->ignore($this->id),
在 Laravel 文档中了解更多信息:https://laravel.com/docs/5.5/validation#rule-unique
【讨论】:
请同时添加use Illuminate\Validation\Rule;
以使用Rule::unique
并添加注释以使$this->id
的值在更新中为4 个参数,在插入中为2 个参数
当我执行您提到的操作时,它适用于创建功能,但不适用于更新。在更新中它一直说 cod_upb 已经存在,我认为这并没有忽略 id
@MariaCamilaCuadrado $this->id 到底是什么?
@C2486 如果你以前用 Laravel 开发过,或者你现在正在用 Laravel 开发,这是常识。我不知道你想对$this->id
评论说什么
@tprj29:OP 已经像您建议的那样使用'cod_upb' => 'required|max:10|unique:equipos,cod_upb,'.$this->id,
,她说它适用于insert
,但不适用于update
,但是是的,第二个建议Rule
会起作用。对于common knowledge
,很多事情都很常见,但人们仍然被卡住了。【参考方案3】:
在Unique 规则中
唯一:表、列、除外、idColumn
第三个参数用于value for column to except
,第四个参数用于column to except
我也像这样对insert
和update
使用一种验证方法
public function validateItems($requestAll)
$id = isset($requestAll['id']) ? ','.$requestAll['id'].',id':'';
$rules = [
'cod_upb' => 'required|max:10|unique:equipos,cod_upb,'.$id,
];
return Validator::make($requestAll, $rules);
只需更改$requestAll['id']
的代码,就像我为id
所做的那样,在您的情况下它可能是$this->id
【讨论】:
以上是关于Laravel:更新和创建时验证唯一的主要内容,如果未能解决你的问题,请参考以下文章