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

问题描述 投票:6回答:6

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

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

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

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

php laravel unique rule laravel-validation
6个回答
22
投票

这会强制忽略特定的id:

'email' => 'unique:table,email_column_to_check,id_to_ignore'

在上面的例子中替换段tableemail_column_to_checkid_to_ignore

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


11
投票

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

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

路线:

Route::patch('users/{user}', 'UserController@update');

控制器:

public function update(UserRequest $request, User $user) 
{
    // ...
}

表格要求:

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

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


3
投票

通过书面形式包括规则

use Illuminate\Validation\Rule;

并编写您的验证码如下:

 'Email' => [required,
            Rule::unique('driver_details')->ignore($id),
            ]

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


1
投票
$request->validate([
    'email' => 'unique:table_name,email,' . $user->id
]);

1
投票

我正在使用Laravel 5.2

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

'user_name'  =>  'required|unique:users_table,user_name,'.$id

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

所以我这样做

'user_name' => 'required|unique:users_table,user_name,'.$id.',user_id'

1
投票

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

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'
        ];
    }
}

0
投票

也有一段时间也面临这个问题。试试这个:

$v = Validator::make($request->all(), [
    'email' => ['required',
    Rule::unique('<table_name>')->ignore(<your_table_id_to_ignore>),
    ]
]);

适用于Laravel 5.8。我不知道它是否适用于较低版本的Laravel。

© www.soinside.com 2019 - 2024. All rights reserved.