【问题标题】:Updating model - email is required to be unique [duplicate]更新模型 - 电子邮件必须是唯一的[重复]
【发布时间】:2015-03-05 16:09:57
【问题描述】:

我有一个视图,它显示了一个包含与用户模型相关的预填充数据的表单。这是为了更新模型数据。但是,当提交表单时,会出现冲突,因为电子邮件地址不是唯一的(如果尚未更改)。但是我仍然希望能够存储它(或忽略它)。

我正在尝试使用此控制器代码更新模型:

    $input = Input::all();

    $validator = Validator::make($input, User::$rules['edit']);

    if ($validator->fails()) {
        return Response::json(array(
            'error' => $validator->messages()
        ));
    }

在模型中,我有:

    public static $rules = array(
    'create' => array(
        'email' => 'required|email|unique:users',
        'password' => 'required|confirmed',
        'firstname' => 'required',
        'lastname' => 'required',
        'address_one'=> 'required',
        'postcode'=> 'required'
    ),
    'edit' => array(
        'email' => 'sometimes|required|email|unique:users',
        'password' => 'sometimes|required|confirmed'
    ),
);

但是当我更新时,我收到错误消息:

"error": {
    "email": [
        "The email has already been taken."
    ]
}

我认为sometimes 会阻止这种行为。我做错了什么?

【问题讨论】:

  • 你想做什么?
  • 我正在尝试更新模型,但如果电子邮件没有更改,那么它会看到它抛出此错误,因为它不是唯一的。

标签: laravel laravel-4


【解决方案1】:

您需要指定用户 ID,以便验证器知道在检查条目的唯一性时需要忽略具有该 ID 的条目:

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

取自Laravel Docs

强制使用唯一规则以忽略给定 ID

'email' => 'unique:users,email_address,10'

在您的情况下,由于您将规则保存在模型属性中,因此您需要在将规则传递给验证器之前附加 ID。应该这样做:

$input = Input::all();
$rules = User::$rules['edit'];

// this assumes the user your want to update
// is stored in the $user variable
$rules['email'] .= ',' . $user->id; 

$validator = Validator::make($input, $rules);

if ($validator->fails()) {
    return Response::json(array(
        'error' => $validator->messages()
    ));
}

【讨论】:

  • 谢谢,但我认为是 .= 而不是 '+='。
  • 是的,你是对的。我会更新答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-26
  • 2016-12-16
  • 2012-01-20
  • 2014-09-21
  • 2012-10-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多