【问题标题】:Laravel - Avoid validation error for unique rule when updatingLaravel - 更新时避免唯一规则的验证错误
【发布时间】:2017-07-28 14:55:11
【问题描述】:

我使用 Laravel 5.3 的验证如下:

在我的模型中:

public static $validation = [
    'name' => 'required',
    'username' => 'required|alpha|unique:companies',
    'email' => 'required|email|unique:companies',
];

在我的控制器中,我在创建新项目或编辑项目时发布到相同的 CompanyController@dataPost 方法:

public function dataPost(Request $request) {

    // First validation
    $this->validate($request, Company::$validation);

    $id = $request->id;

    if ($id > 0) {
        // Is an edit!
        $company = Company::find($id);
        $company->update($request->all());
        $company->save();

        Session::flash('messageclass', 'success');
        Session::flash('message', trans('companies.editedsuccessfully'));

    } else {
        // Is a create
        $company = new Company($request->all());
        $company->save();

        Session::flash('messageclass', 'success');
        Session::flash('message', trans('companies.createdsuccessfully'));
    }

    return redirect()->route('companyindex');
}

唯一验证在我创建新项目时正常工作,但在编辑项目时会导致错误(因为它将用户名标记为已存在)。

知道如何避免这种情况吗?即使在编辑中,我仍然希望确保数据在更改时是唯一的,但如果值与以前相同,则忽略验证。

我知道我可以手动执行此操作,但我想知道是否有内置方法可以避免这种情况。

谢谢!

【问题讨论】:

    标签: php laravel laravel-5.3


    【解决方案1】:

    我想你可以试试这个:

    public static $validation = [
        'name' => 'required',
        'email'     => Auth::check()
                    ? 'required|email|unique:companies,email,'.Auth::id()
                    : 'required|email|unique:companies,email',
        'username'  => Auth::check()
                    ? 'required|alpha|unique:companies,username,'.Auth::id()
                    : 'required|alpha|unique:companies,username',
    ];
    

    希望这对你有用!!!

    【讨论】:

    • 感谢您的回答!如果我理解正确,这将导致 unique 规则被当前用户的 id 忽略。这会阻止我将电子邮件更改为现有用户的电子邮件吗?
    • 是的,你是对的。传递 id 使 Laravel 在查找存储/重复值时忽略您的更新用户。
    • @zundi:希望,我的答案是你的解决方案,它对你来说很好。
    【解决方案2】:

    您也可以使用唯一属性更新email 字段。

    以下规则将检查除当前邮件之外的其他列中所有电子邮件的唯一性。

    试试这个,

    'email' => 'required|unique:users,email,' . $userId
    

    这里的$userId 指的是当前更新用户的id

    可以看官方文档here

    【讨论】:

      【解决方案3】:

      您可以为insertupdate 创建不同的验证方法

      public static $validation_update = [
          'name' => 'required',
          'username' => 'required|alpha',
          'email' => 'required|email',
      ];
      
      public static $validation_add = [
          'name' => 'required',
          'username' => 'required|alpha|unique:companies',
          'email' => 'required|email|unique:companies',
      ];
      

      然后在条件中应用验证

      public function dataPost(Request $request) {
      
          // First validation
      
      
          $id = $request->id;
      
          if ($id > 0) {
              // Is an edit!
            $this->validate($request, Company::$validation_update);
              $company = Company::find($id);
              $company->update($request->all());
              $company->save();
      
              Session::flash('messageclass', 'success');
              Session::flash('message', trans('companies.editedsuccessfully'));
      
          } else {
              // Is a create
            $this->validate($request, Company::$validation_add);
              $company = new Company($request->all());
              $company->save();
      
              Session::flash('messageclass', 'success');
              Session::flash('message', trans('companies.createdsuccessfully'));
          }
      
          return redirect()->route('companyindex');
      }
      

      【讨论】:

      • 感谢您的回答。这是这种情况的标准做法吗?
      • 您缺少的一件事是,如果在更新期间我(例如)将用户名更改为已经存在的用户名。
      • @zundi 避免更新 username 的更好方法
      【解决方案4】:

      $id = $request->id;

      if ($id > 0) {
          // Is an edit!
        $this->validate($request, Company::$validation_update);
          $company = Company::find($id);
          $company->update($request->all());
          $company->save();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-09-13
        • 2015-02-27
        • 2018-06-12
        • 2018-05-24
        • 1970-01-01
        • 2014-04-19
        • 2019-10-24
        相关资源
        最近更新 更多