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

我也像这样对insertupdate 使用一种验证方法

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:更新和创建时验证唯一的主要内容,如果未能解决你的问题,请参考以下文章

如何在使用 laravel 表单请求更新数据时验证电子邮件的唯一性?

在 laravel 中更新数据时显示错误的唯一键验证

Laravel更新模型,具有属性的唯一验证规则

具有唯一字段的 Laravel 验证服务

Laravel 检查没有自身更新的唯一规则

Laravel 从在 API 级别更新它的用户中验证唯一的移动设备?