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

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

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

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

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

【问题讨论】:

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

标签: php laravel unique rule laravel-validation


【解决方案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
                                ]);
                                

                                【讨论】:

                                • 欢迎来到 StackOverflow!请考虑在您的代码中添加一些解释,以便 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) 也可以使用。
                                  猜你喜欢
                                  • 2020-09-13
                                  • 1970-01-01
                                  • 2023-04-03
                                  • 2014-04-19
                                  • 1970-01-01
                                  • 1970-01-01
                                  • 2015-02-27
                                  • 2018-06-12
                                  相关资源
                                  最近更新 更多