Laravel 检查没有自身更新的唯一规则

Posted

技术标签:

【中文标题】Laravel 检查没有自身更新的唯一规则【英文标题】:Laravel check for unique rule without itself in update 【发布时间】:2015-03-27 17:53:03 【问题描述】:

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

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

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

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

【问题讨论】:

Laravel 4 validation email unique constraint的可能重复 @patricus:我收到了你的问题,但在你的回答中你没有说如何获得 $id,如果他们确实验证了他们自己的个人资料,他们就可以得到他们的 id由Auth::user()->id 和如果管理员对其他部分做这些部分,我应该设置会话并进入模型,,,??? 您目前如何获取您尝试更新的记录的 ID? 我正在将所有值发送到模型,$validation = Validator::make($DriverData, DriverModel::$updaterules); 我在这里发了一个新问题,会很清楚,你可以看看这里,,***.com/questions/28205762/… 【参考方案1】:
  $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);
    

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

【讨论】:

【参考方案2】:

这是其他解决方案,注意路由参数,是用户的“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',
        //...
        ];
    
    //...

【讨论】:

【参考方案3】:

这在 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)
            ]
        ];
    

【讨论】:

【参考方案4】:

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

/something/user/something

return [
        'level' => 'required|max:5|unique:users,level,'. optional($this->user)->id,
    ];

【讨论】:

【参考方案5】:

你可以试试这样检查删除的列是否为空

例如:

$this->validate($request, [
  'email' => 'required|string|max:255|unique:table_name,email,'.$request->id.',id,deleted_at,NULL'
]);

【讨论】:

【参考方案6】:

检查一下,

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

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

【讨论】:

【参考方案7】:

它会起作用的......

$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'
    ]
);

【讨论】:

【参考方案8】:

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

这是我用的:

public function rules()

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

如果更新,则$this->user->id 将被忽略。 否则,如果它被创建,它将忽略 id 0,它本来就不存在。

【讨论】:

【参考方案9】:

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

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

【讨论】:

【参考方案10】:

尝试使用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'
    ]);

【讨论】:

只是为访问者添加注释,此方法适用于 Laravel/Lumen 7.0 :-)【参考方案11】:
<?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,
           
        ];
    

【讨论】:

【参考方案12】:

试试这个

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

$this-&gt;id 将是您请求中的值

【讨论】:

【参考方案13】:

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

use Illuminate\Validation\Rule;

public function update(Request $request, $id)

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

    // ...

【讨论】:

【参考方案14】:

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

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

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

【讨论】:

【参考方案15】:

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

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

【讨论】:

【参考方案16】:

这会强制忽略特定的 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

【讨论】:

但是我怎样才能在模型中获得id_to_ignore,我无法获得Auth::user()-&gt;id,因为这是管理部分并为其他用户进行验证.. 你可以像这样从请求中得到它:request()-&gt;route('route wildcard')-&gt;id 如果您像这样定义路由:Route::apiresource('car', 'Api\CarController'),那么您可以像这样检索资源的 ID:request()-&gt;route('car')request()-&gt;route()-&gt;parameters['car]。如果您在请求对象中,您也可以使用$this 而不是request()【参考方案17】:

我正在使用 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'

【讨论】:

【参考方案18】:
$request->validate([
    'email' => 'unique:table_name,email,' . $user->id
]);

【讨论】:

欢迎来到 ***!请考虑在您的代码中添加一些解释,以便 OP 和其他用户可以深入了解您的答案如何以及为什么适用。 :)【参考方案19】:

通过书写包含规则

use Illuminate\Validation\Rule;

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

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

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

【讨论】:

【参考方案20】:

对于那些使用 Laravel 5 和 Form Requests 的用户,您可以直接将 Route-Model Binding 的模型的 id 作为 Form Request 的属性获取为$this-&gt;name_of_the_model-&gt;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')
            ],
            //...
        ];
    
    //...

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

【讨论】:

Rule::unique('users')-&gt;ignoreModel($this-&gt;user) 也可以使用。

以上是关于Laravel 检查没有自身更新的唯一规则的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法检查 laravel 5.2 中的几个输入是不是唯一?

在 laravel 5 中更新具有唯一列的模型

Laravel 唯一的验证规则,除了不工作

Laravel:更新和创建时验证唯一

具有唯一字段的 Laravel 验证服务

在 laravel 中更新数据时显示错误的唯一键验证