2017-07-28 94 views
0

当我使用Laravel 5.3的验证如下避免了独特的规则验证错误:Laravel更新

在我的模型:

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

在我的控制,我张贴到同一[email protected]方法创建一个新的项目或编辑之一,当时:当我创建一个新项目

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

独特的验证工作正常,但导致错误(如在它的标志作为用户名已经存在)WH编辑一个项目。

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

我知道我可以手动做到这一点,但我不知道是否有内置的方法来避免这种情况。

谢谢!

回答

0

您可以insert创建不同的验证方法或update

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'); 
} 
+0

感谢您的回答。这是这种情况下的标准做法吗? – zundi

+0

你缺少的一件事是如果在更新期间我(例如)将用户名更改为已存在的用户名。 – zundi

+0

@ zundi更好的方式来避免更新'用户名' –

-2

的$ id = $请求 - > ID应用验证;

if ($id > 0) { 
    // Is an edit! 
    $this->validate($request, Company::$validation_update); 
    $company = Company::find($id); 
    $company->update($request->all()); 
    $company->save(); 
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', 
]; 

希望这对你的工作!

+0

感谢您的回答!如果我理解正确,这会导致当前用户的id被忽略'unique'规则。这会阻止我将电子邮件更改为现有用户的电子邮件吗? – zundi

+0

是的,你是对的。传递id使Laravel在查找存储/重复值时忽略更新的用户。 – aaron0207

+0

@ zundi:希望,我的回答是你的解决方案,它适合你。 –

0

您可以更新email字段与独特的属性以及。

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

试试这个,

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

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

你可以看到官方文档here