Laravel 使用唯一的属性验证规则更新模型

2022-08-30 07:48:48

我有一个Laravel模型,它对和有一个唯一的验证规则。在我的存储库中,当我更新模型时,我会重新验证字段,以免出现所需的规则验证问题:Userusernameemail

public function update($id, $data) {
    $user = $this->findById($id);
    $user->fill($data);
    $this->validate($user->toArray());
    $user->save();

    return $user;
}

这在以下测试中失败:

ValidationException: {“username”:[“用户名已被占用。”],“email”:[“该电子邮件已被获取。

有没有办法优雅地解决这个问题?


答案 1

将当前正在更新的实例追加到验证程序。id

  1. 传递实例以忽略唯一验证程序。id

  2. 在验证程序中,使用参数检测是要更新还是创建资源。

如果更新,请强制唯一规则忽略给定的 id:

//rules
'email' => 'unique:users,email_address,' . $userId,

如果创建,请照常继续:

//rules
'email' => 'unique:users,email_address',

答案 2

另一种优雅的方式...

在模型中,创建一个静态函数:

public static function rules ($id=0, $merge=[]) {
    return array_merge(
        [
            'username'  => 'required|min:3|max:12|unique:users,username' . ($id ? ",$id" : ''),
            'email'     => 'required|email|unique:member'. ($id ? ",id,$id" : ''),
            'firstname' => 'required|min:2',
            'lastname'  => 'required|min:2',
            ...
        ], 
        $merge);
}

创建时验证:

$validator = Validator::make($input, User::rules());

更新验证:

$validator = Validator::make($input, User::rules($id));

更新时进行验证,并附带一些其他规则:

$extend_rules = [
    'password'       => 'required|min:6|same:password_again',
    'password_again' => 'required'
];
$validator = Validator::make($input, User::rules($id, $extend_rules));

好。


推荐