41

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

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

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

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

4

20 回答 20

70

这会强制忽略特定的 id:

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

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

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

于 2015-01-28T17:48:55.447 回答
26

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

例如,如果您想拥有唯一的电子邮件,但也允许管理员编辑用户,您可以这样做:

路线:

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')
            ],
            //...
        ];
    }
    //...
}

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

于 2017-09-09T18:04:21.353 回答
13
$request->validate([
    'email' => 'unique:table_name,email,' . $user->id
]);
于 2018-11-23T05:44:15.560 回答
8

我正在使用 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'
于 2018-12-08T10:41:20.043 回答
7

通过写入包含规则

use Illuminate\Validation\Rule;

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

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

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

于 2018-05-15T03:32:34.977 回答
6

检查这个,

'email' => [
        'required',
        Rule::unique('users')->ignore($user->id),
    ],

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

于 2020-12-16T16:34:46.747 回答
6

尝试这个

'email' => 'unique:table_name,column_name,'.$this->id.',id'

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

于 2020-01-07T09:24:37.597 回答
4

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

use Illuminate\Validation\Rule;

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

    // ...
}
于 2019-12-19T07:21:56.453 回答
4

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

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'
        ];
    }
}
于 2019-03-16T17:11:17.177 回答
2

有一种更短的方法,在我的情况下,我使用的是路由模型绑定,URL 格式是

/something/{user}/something

return [
        'level' => 'required|max:5|unique:users,level,'. optional($this->user)->id,
    ];
于 2021-03-30T15:25:03.110 回答
1

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

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

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

于 2019-08-02T07:18:55.330 回答
1

这是其他解决方案,注意路由参数,是用户的“id”。与 Arian Acosta 提到的解决方案进行比较。

路线:

Route::patch('users/{id}', [UserController::class, 'update']);

控制器:

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

表格要求:

class UserRequest extends FormRequest
{
    public function rules()`
    {
        return [
            'name' => 'required|string',
            'email' => 'required|email|unique:users,email,'.$this->id.',id',
        //...
        ];
    }
    //...
}
于 2021-09-14T04:56:01.410 回答
1

这在 Laravel 8 上对我有用。

use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Rule;

class UserRequest extends FormRequest
{
    public function authorize()
    {
        return true;
    }

    public function rules()
    {
        return [
            'name' => 'required|string',
            'email' => [
                'required',
                'email',
                Rule::unique('users', 'email')->ignore($this->user)
            ]
        ];
    }
}
于 2021-08-25T03:31:08.210 回答
1

尝试使用Rule::unique('users')->ignore(Auth::id())

    //Validation
    $data = $request->validate([
        'username' => ['required', Rule::unique('users')->ignore(Auth::id()), 'min:4'],               //Verificar que este seleccionado sea único {Exceptuando mi mismo}
        'content' => 'required|min:6',
        'cover' => 'required|image'
    ]);
于 2020-08-13T19:40:29.630 回答
1

我对创建和更新使用相同的规则。但是对于更新,我需要它忽略自我。

这就是我使用的:

public function rules()
{
    return [
        'email' => [
            'required',
            'email',
            Rule::unique('users')->ignore($this->user->id ?? 0),
        ],
        // ...other fields
    ];
}

如果更新,$this->user->id则将被忽略。否则,如果它被创建,它将忽略 id 0,无论如何它都不存在。

于 2020-10-22T04:34:17.107 回答
1

您可以尝试这样检查是否在列删除为空

例如:

$this->validate($request, [
  'email' => 'required|string|max:255|unique:table_name,email,'.$request->id.',id,deleted_at,NULL'
]);
于 2021-06-18T07:41:22.743 回答
1
<?php

namespace App\Http\Requests\Admin\User;

use App\Model\User;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Http\Request;


class UpdateRequest extends FormRequest
{
    protected $id;

    public function __construct(Request $request)
    {
        $this->id = (integer) $request->route()->user;
    }

    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            'first_name' => 'required|max:20',
            'last_name' => 'nullable|max:20',
            'mobile' => 'required|size:10|unique:users,mobile,'.$this->id,
           
        ];
    }
}
于 2020-07-09T12:33:32.343 回答
0
  $validator = validator()->make($request->all(), [
            'product_name'  => 'required|min:10|unique:products,name,'.$id,
            'product_slug'  => 'required|min:10|unique:products,slug,'.$id,
            'product_desc'  => 'required',
            'short_desc'    => 'required',
            'color'         => 'required',
            'product_sku'   => 'required|unique:products,sku,'.$id,
            'offer_price'   => 'required',
            'actual_price'  => 'required',
            'product_size*' => 'required',
            'product_image*'=> 'required|mimes:jpeg,png,jpg',
            'product_brand' => 'required',
            'product_meta'  => 'required',
        ]);

    if($validator->fails()) {
        $messages = $validator->messages();
        return redirect()->back()->withErrors($messages);
    }

这个 $id 强制一个独特的规则忽略给定的 id 这对我有用

于 2022-02-11T12:34:42.650 回答
0

它会工作...

$this->validate($request, 
    [
        'name' => 'required|unique:your_table_name,column_name,'.$request->auto_increment_id
    ],
    [
        'name.required' => 'Name should not be empty',
        'name.unique' => 'Name Already Exists'
    ]
);
于 2020-10-22T04:46:45.527 回答
0

我通常在控制器构造上创建一个规则数组,如下所示:

public function __construct()
{
    $this->rules = [
    'name' => 'required',
    'isCPNJ' => 'required',
    'CPF_CNPJ' => 'required',
    'password' => 'sometimes',
    'role_id' => 'sometimes',
    ];
 }

然后,当我需要验证特定的东西时,比如更新时的 id 和电子邮件,我创建一个 specificRules 变量并连接我希望在规则末尾忽略的 id,如下所示:

//Add the original rules to specificRules, just to make things more readable
$specificRules = $this->rules;
//Add the new rules
$specificRules['email'] = 'required|email|unique:users,email,' . $request['id'];
$specificRules['id'] = 'required|exists:users';
//Validate and save in $postData
$postData = $this->validate($request, $specificRules);

如果有人有更清洁和简单的方法,请告诉我:D

于 2020-08-15T18:14:38.377 回答