Laravel在更新时检查没有自己的唯一规则

12 php unique rule laravel laravel-validation

我在更新部分中有唯一的验证规则.

在插入或添加唯一规则时'Email' => array('unique:driver_details'),,它将检查唯一的coloumn.

但是更新部分失败了.虽然更新它满足其他规则,并且在电子邮件的唯一中它会检查自己的唯一coloumn并且它会失败但看到自己的字段.

那么,我如何检查数据库中除了自己的值之外的唯一?

use*_*582 25

这会强制忽略特定的id:

'email' => 'unique:table,email_column_to_check,id_to_ignore'
Run Code Online (Sandbox Code Playgroud)

替换段table,email_column_to_check,id_to_ignore在上述的例子

你可以在这里查看http://laravel.com/docs/4.2/validation#rule-unique

  • 但是我如何在模型中获取“id_to_ignore”,我无法获取“Auth::user()->id”,因为这是管理部分并为其他用户进行验证。 (4认同)

Ari*_*sta 12

对于使用Laravel 5和Form Requests的用户,您可以直接将Route-Model Binding模型的id作为Form Request的属性获取,$this->name_of_the_model->id然后使用它从唯一规则中忽略它.

例如,如果您想拥有唯一的电子邮件,但也允许管理员编辑用户,您可以执行以下操作:

路线:

Route::patch('users/{user}', 'UserController@update');
Run Code Online (Sandbox Code Playgroud)

控制器:

public function update(UserRequest $request, User $user) 
{
    // ...
}
Run Code Online (Sandbox Code Playgroud)

表格要求:

class UserRequest extends FormRequest
{
    // ...
    public function rules()
    {
        return [
            'name' => 'required|string',
            'email' => [
                'required',
                'email',
                Rule::unique('users')->ignore($this->user->id, 'id')
            ],
            //...
        ];
    }
    //...
}
Run Code Online (Sandbox Code Playgroud)

请注意,我们忽略了正在编辑的用户,在这种情况下,用户可能与经过身份验证的用户不同.


小智 12

$request->validate([
    'email' => 'unique:table_name,email,' . $user->id
]);
Run Code Online (Sandbox Code Playgroud)

  • 欢迎使用 StackOverflow!请考虑在您的代码中添加一些解释,以便 OP 和其他用户可以深入了解您的答案适用的方式和原因。:) (3认同)

小智 7

通过书写包含规则

use Illuminate\Validation\Rule;
Run Code Online (Sandbox Code Playgroud)

并编写您的验证代码如下:

 'Email' => [required,
            Rule::unique('driver_details')->ignore($id),
            ]
Run Code Online (Sandbox Code Playgroud)

这里 $id 是您在验证期间要忽略的电子邮件的 ID,它是从控制器获取的。


Nir*_*hoi 7

我正在使用 Laravel 5.2

如果您的主键名为 'id' 表名是 users_table 并且我想更新 user_name 所以我这样做

'user_name'  =>  'required|unique:users_table,user_name,'.$id
Run Code Online (Sandbox Code Playgroud)

如果您的主键未命名为 'id' 在我的情况下,我的主键是 user_id,表名是 users_table,我想更新 user_name

所以我这样做

'user_name' => 'required|unique:users_table,user_name,'.$id.',user_id'
Run Code Online (Sandbox Code Playgroud)


Juh*_*nia 6

这花了我一段时间才弄清楚,但是当您处理更新/创建请求时,您还可以访问请求对象。在这里,我强制客户端名称是唯一的,但允许当前编辑的客户端。

class CreateUpdateClientRequest extends FormRequest
{
    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            'name' => [
                'required',
                'string',
                'min:3',
                'max:50',
                Rule::unique('clients')->ignore($this->request->get('id'))
            ],
            'primary_contact_name' => 'required|string|min:3|max:50',
            'primary_contact_email' => 'required|string|email|min:5|max:50',
            'primary_contact_phone' => 'nullable|string|min:5|max:50',
            'secondary_contact_name' => 'nullable|string|min:3|max:50',
            'secondary_contact_email' => 'nullable|string|email|min:5|max:50',
            'secondary_contact_phone' => 'nullable|string|min:5|max:50',
            'notes' => 'nullable'
        ];
    }
}
Run Code Online (Sandbox Code Playgroud)


yes*_*nik 6

在 Laravel 6 应用程序中,它帮助我从验证中排除当前用户的电子邮件:

use Illuminate\Validation\Rule;

public function update(Request $request, $id)
{
    $request->validate([
        'email' => [
            'email',
            'required',
             Rule::unique('claims')->ignore($id),
        ],
    ]);

    // ...
}
Run Code Online (Sandbox Code Playgroud)


mwa*_*afi 6

尝试这个

'email' => 'unique:table_name,column_name,'.$this->id.',id'
Run Code Online (Sandbox Code Playgroud)

$this->id 将是您请求的价值


小智 5

检查这个,

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

在此处查看https://laravel.com/docs/7.x/validation#rule-unique