Laravel:验证在更新时是唯一的

use*_*736 42 php validation laravel laravel-4

我知道这个问题之前已被多次询问,但没有人解释当你在模型中验证时如何获得id.

'email' => 'unique:users,email_address,10'
Run Code Online (Sandbox Code Playgroud)

我的验证规则在模型中,因此如何将记录的ID传递给验证规则.

这是我的模特/用户

protected $rules_update = [
    'email_address' => 'required|email|unique:users,email_address,'.$id,
    'first_name' => "required",
    'last_name' => "required",
    'password' => "required|min:6|same:password_confirm",
    'password_confirm' => "required:min:6|same:password",
    'password_current' => "required:min:6"
];
Run Code Online (Sandbox Code Playgroud)

车型/ BaseModel

    protected $rules = array();

public $errors;

/*
    * @data: array, Data to be validated
    * @rules: string, rule name in model 
*/

public function validate($data, $rules = "rules") {

    $validation  = Validator::make($data, $this->$rules);

    if($validation->passes()) {
        return true;
    }

    $this->errors = $validation->messages();

    return false;
}
Run Code Online (Sandbox Code Playgroud)

Reh*_*mat 31

附带说明一下email_address,在Laravel的内置身份验证系统中,该字段的大多数答案都是谈论电子邮件字段名称为just email。这是一个示例,您可以如何验证唯一字段,即有关更新的电子邮件:

Form Request中,您这样做:

public function rules()
{
  return [
      'email' => 'required|email|unique:users,email,'.$this->user->id,
  ];
}
Run Code Online (Sandbox Code Playgroud)

或者,如果您要直接在控制器中验证数据:

public function update(Request $request, User $user)
{
  $request->validate([
      'email' => 'required|email|unique:users,email,'.$user->id,
  ]);
}
Run Code Online (Sandbox Code Playgroud)

更新:如果您正在更新在用户签名的,而不是注入User模型到你的路线,你可以访问时遇到未定义的属性id$this->user。在这种情况下,请使用:

public function rules()
{
  return [
      'email' => 'required|email|unique:users,email,'.$this->user->id,
  ];
}
Run Code Online (Sandbox Code Playgroud)

自Laravel 5.7起,一种更优雅的方法是:

public function update(Request $request, User $user)
{
  $request->validate([
      'email' => 'required|email|unique:users,email,'.$user->id,
  ]);
}
Run Code Online (Sandbox Code Playgroud)

PS:我添加了一些其他规则,即必填规则和电子邮件,以使新手可以清楚地了解此示例。

  • 使用 `\Illuminate\Validation\Rule::unique()` 这确实是最优雅的方式。对我来说,这是最好的建议。谢谢 (3认同)
  • 我应该如何访问/提供 $this->user() 或 FormRequest 中的其他模型?就像 ArticleFormRequest 中的 $this->article() (2认同)

Ric*_*las 28

简单的解决方案.

在你的模型中

protected $rules = [
    'email_address' => 'sometimes|required|email|unique:users',
    ..
];
Run Code Online (Sandbox Code Playgroud)

在您的Controller中,操作:更新

...
$rules = User::$rules;
$rules['email_address'] = $rules['email_address'] . ',id,' . $id;
$validationCertificate  = Validator::make($input, $rules); 
Run Code Online (Sandbox Code Playgroud)

  • 无法访问受保护的属性 App\User::$rules (2认同)

Him*_*Hah 20

有一种优雅的方式来做到这一点.如果您使用的是资源控制器,则编辑记录的链接将如下所示:

/ users/{user}/edit OR/users/1/edit

在您的UserRequest中,规则应如下所示:

public function rules()
{
    return [
        'name' => [
            'required',
            'unique:users,name,' . $this->user
        ],
    ];
}
Run Code Online (Sandbox Code Playgroud)

或者,如果您编辑记录的链接如下所示:

/用户/编辑/ 1

你也可以试试这个:

public function rules()
{
    return [
        'name' => [
            'required',
            'unique:users,name,' . $this->id
        ],
    ];
}
Run Code Online (Sandbox Code Playgroud)


tew*_*shi 8

从Laravel 5.7起,这很好用

use Illuminate\Validation\Rule;

Validator::make($data, [
    'email' => [
        'required',
        Rule::unique('users')->ignore($user->id),
    ],
]);
Run Code Online (Sandbox Code Playgroud)

强制使用唯一规则忽略给定的ID:


Nee*_*iya 8

您也Laravel 8.x可以使用Rule::unique方法

强制唯一规则忽略给定 ID:

use Illuminate\Validation\Rule;

public function update(Request $request, Post $post)
{
    $validatedData = $request->validate([
        'name' => ['required', 'max:60', Rule::unique('posts')->ignore($post->id)],
    ]);

    $post->update($validatedData);
    
    return redirect(route('posts.index'))->with('status', 'post updated successfully');
}
Run Code Online (Sandbox Code Playgroud)


小智 7

测试以下代码:

'email' => 'required|email|unique:users,email_address,'. $id .'ID'
Run Code Online (Sandbox Code Playgroud)

其中 ID 是表的主 ID


Naz*_*que 7

在控制器中执行一步

与 Laravel 9 配合良好

$request->validate([
        'name'=>'required|unique:categories,name,'.$id,
    ]);
Run Code Online (Sandbox Code Playgroud)


Luc*_*cas 6

如果我了解您想要什么:

'email'=>'required | email | unique:users,email_address,'。$ id。''

在模型更新方法中,例如,应接收带有参数的$ id。

对不起,我的英语不好。


小智 6

你可以试试这个。

protected $rules_update = [
    'email_address' => 'required|email|unique:users,email_address,'. $this->id,
    'first_name' => "required",
    'last_name' => "required",
    'password' => "required|min:6|same:password_confirm",
    'password_confirm' => "required:min:6|same:password",
    'password_current' => "required:min:6"
];
Run Code Online (Sandbox Code Playgroud)


小智 6

最好的选择是在更新数据的唯一验证时尝试一次不需要更多代码

'email' => 'unique:users,email_address,' . $userId,
Run Code Online (Sandbox Code Playgroud)

这里email是字段名, users 是表名, email_address 是你想要唯一的表属性名, $userid 正在更新行 id


小智 5

public function rules()
{

    switch($this->method())
    {
        case 'GET':
        case 'DELETE':
        {
            return [];
        }
        case 'POST':
        {
            return [
                'name' => 'required|unique:permissions|max:255',
                'display_name' => 'required',
            ];
        }
        case 'PUT':
        case 'PATCH':
        {
            return [                    
                'name' => 'unique:permissions,name,'.$this->get('id').'|max:255',
                'display_name' => 'required',
            ];
        }
        default:break;
    }    
}
Run Code Online (Sandbox Code Playgroud)

  • 有时,id 可能是 URL 的一部分,因此您可以在路由参数中找到它: $this->route({field_name}) 例如: $this->route('id') (2认同)

小智 5

经过5.2版测试的更简单的解决方案

在您的模型中

// validator rules
public static $rules = array(
    ...
    'email_address' => 'email|required|unique:users,id'
);
Run Code Online (Sandbox Code Playgroud)


Ras*_*hat 5

这是解决方案:

更新:

public function controllerName(Request $request, $id)

{

    $this->validate($request, [
        "form_field_name" => 'required|unique:db_table_name,db_table_column_name,'.$id
    ]);

    // the rest code
}
Run Code Online (Sandbox Code Playgroud)

就是这样。快乐编码:)


小智 5

如果您有单独的规则方法。您可以更轻松地使用以下语法。

public function rules()
{
    return [
        'email' => "required|unique:users,email,{$this->id}"
    ]; 
}
Run Code Online (Sandbox Code Playgroud)