0

这是来自我用于标签表单验证的验证

public function rules()
{
     return [
         'name' => 'required|max:50|min:3|unique:tags,name,'.$this->tag,
     ];
}

我的控制器代码

public function update(TagValidation $request, Tag $tag )
{
    $tag->update($request->all());
}

我试图在尝试更新时避免唯一提交的验证问题。使用后

unique:tags,name,'.$this->tag

我得到低于 sql 错误

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'name:"abc"' in 'where clause' (SQL: select count(*) as aggregate from `tags` where `name` = abc and `name:"abc"` <> {"id":14 and `created_at:"2020-06-13T16:24:36`.`000000Z"` = updated_at:"2020-06-13T16:46:44.000000Z"}) 

但是我在数据库中有名称列并且存储工作正常如果我不在验证中使用 $this->tag 。

4

2 回答 2

1

小心,因为唯一的验证是

唯一的:表,列,除了,idColumn

您正在传递标签的值 anme 但不是必需的

你实际使用:

return [
   'name' => 'required|max:50|min:3|unique:tags,name,'.$this->tag,
];

但是您需要使用它,我向您展示了在存储和更新(POST 和 PUT 方法)上使用相同验证的工作示例:

public function rules()
{
    if ($this->method() == 'PUT') 
    {
        return [
             'name' => 'required|unique:tags,name,'.$this->id.',id',
        ];
    }elseif ($this->method() == 'POST'){
         return [
             'name' => 'required|unique:tags,name'
         ];
    }
}

包含在 Laravel 7* 上,您可以直接使用模型

public function rules()
{
    // Check Create or Update
    if ($this->method() == 'PUT') 
    {
        return [
            'name' => 'required|unique:App\Tag,name,'.$this->id.',id'
        ];
    }elseif ($this->method() == 'POST'){
        return [
            'name' => 'required|unique:App\Tag,name'
        ];
    }
}
于 2020-06-13T17:58:33.343 回答
1

您应该传递要忽略的唯一规则的记录的 id,我假设该规则是该标签:

 'name' => 'required|max:50|min:3|unique:tags,name,'. $this->tag->id,

或者您可以使用规则的对象版本,您可以将模型直接传递给:

'name' => [
    'required', 'max:50', 'min:3', 
    Rule::unique('tags')->ignore($this->tag),
],
于 2020-06-13T18:14:58.640 回答