这是我用于标签形式验证的验证
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,则数据库中有name列,并且存储工作正常。
答案 0 :(得分:1)
请注意,因为唯一验证是
unique:表,列,除外,idColumn
您正在传递标签的值主题,但这不是必需的
您实际使用的是:
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'
];
}
}
答案 1 :(得分:1)
您应该传递要忽略的唯一规则的记录ID,我认为该唯一规则是该标签:
'name' => 'required|max:50|min:3|unique:tags,name,'. $this->tag->id,
或者您可以使用Rule的对象版本,您可以将模型直接传递给:
'name' => [
'required', 'max:50', 'min:3',
Rule::unique('tags')->ignore($this->tag),
],