Laravel - 更新时避免唯一规则的验证错误

时间:2017-07-28 05:51:12

标签: php laravel laravel-5.3

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

当我创建一个新项目时,唯一验证工作正常,但在编辑项目时会导致错误(如在其中标记用户名已经存在)。

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

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

谢谢!

4 个答案:

答案 0 :(得分: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',
];

希望这对你有用!!!

答案 1 :(得分:0)

您可以为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');
}

答案 2 :(得分:0)

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

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

试试这个,

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

此处$userId是指当前更新的用户的id

您可以查看官方文档here

答案 3 :(得分:-2)

$ 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();