Laravel唯一请求更新

时间:2018-07-30 08:23:51

标签: laravel validation

我已经在laracast和Stackoverflow上阅读了一些有关此内容的内容。

我具有带有验证功能的更新功能:

public function update(Customer $customer, StoreCustomer $request)
{
    $customer->update($request->validated());
    exit();
}

以及验证规则:

 public function rules()
{
    return [
        'code'  => 'required|unique:customers,code',
    ]
}

现在,我尝试在唯一变量后添加第3个参数,因此,如果该参数存在,它将继续。我这样尝试过:

 public function rules(Customer $customer)
 {
    return [
        'code'  => 'required|unique:customers,code,'.$customer->code,
    ]
}

但是这似乎没有任何作用。如果您在我的控制器本身中进行验证,这似乎可行,但这看起来更干净。有解决方案吗?

4 个答案:

答案 0 :(得分:0)

如果要忽略当前客户,则需要将$customer->code更改为$customer->id,并假设主键为id

unqiue validation documentation

忽略当前客户:

'code' => 'required|unique:customers,code,'.$customer->id,

答案 1 :(得分:0)

您的表格请求是一个请求。它填充了当前请求中的数据。您可以从路由中拉出customer,因为它目前已绑定为参数。 $this->route('customer')

public function rules()
{
    return [
        'code' => 'required|unique:customers,code,'. $this->route('customer')->code,

        // perhaps this should be ignoring by id though?
        'code' => 'required|unique:customers,code,'. $this->route('customer')->id,
    ];
}

如果在容器中为该确切类注册了一个方法,或者在该类的新实例中注册了这种情况,那么在这里使用方法注入只能给您绑定。该类名称与可能存在一个路由参数当前包含一个恰好属于该类的模型的概念之间没有任何联系。

答案 2 :(得分:0)

似乎正确的方法是

'code'  => 'required|unique:customers,code,'.$this->route('customer')->code.',code',

由于$ customer参数在rules()中不可用,因此您需要以其他方式获取客户。

答案 3 :(得分:-1)

我认为最好的方法是使用Rule:unique

return [
    'code'  => ['required', Rule::unique('customers', 'code')->whereNot('code', $customer->code)]
]