【问题标题】:Laravel: Validation unique when update and createLaravel:更新和创建时验证唯一
【发布时间】: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 代表什么?

标签: php mysql laravel validation unique


【解决方案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

    【讨论】:

      猜你喜欢
      • 2014-06-28
      • 2014-08-20
      • 2018-08-09
      • 2019-02-26
      • 1970-01-01
      • 1970-01-01
      • 2022-11-10
      • 2021-09-16
      • 2015-04-24
      相关资源
      最近更新 更多