Laravel 4 表单验证在更新表单上应该是唯一的,但如果是当前的则不是

Posted

技术标签:

【中文标题】Laravel 4 表单验证在更新表单上应该是唯一的,但如果是当前的则不是【英文标题】:Laravel 4 Form Validation should be unique on update form, but not if current 【发布时间】:2015-03-19 06:00:01 【问题描述】:

我正在尝试验证更新用户个人资料表单,其中验证应检查电子邮件是否不存在,但忽略用户现有电子邮件是否仍然存在。

但是,这会继续返回验证错误消息“此电子邮件已被占用”。

我真的不确定我哪里出错了。否则,更新表单将完美运行并更新。

html

  Form::text('email', Input::old('email', $user->email), array('id' => 'email', 'placeholder' => 'email', 'class' => 'form-control')) 

路线

Route::post('users/edit/user', array('before' => 'admin', 'uses' => 'UserController@update'));

用户模型

'email' => 'unique:users,email, $id '

【问题讨论】:

$id 如何在您的用户模型中被替换? 我曾经在我的控制器中使用它,但是由于我将所有验证都移到了模型中,所以它没有。我不确定如何将 id 传递给模型。也许这就是它失败的地方 【参考方案1】:

您可以使用验证器的有时功能来完成此操作

类似:

$validator->sometimes('email', 'unique:users,email', function ($input) 
    return $input->email == Input::get('email');
);

更多信息请见http://laravel.com/docs/4.2/validation#conditionally-adding-rules

【讨论】:

【参考方案2】:

您的规则编写正确以忽略特定 ID,但是,您需要在尝试验证之前更新您的唯一规则中 $id 的值。

我不一定是这种方法的忠实拥护者,但假设您的规则是 User 对象上的静态属性,您可以创建一个静态方法,该方法将水合并返回具有正确值的规则。

class User extends Eloquent 
    public static $rules = array(
        'email' => 'unique:users,email,%1$s'
    );
    public static function getRules($id = 'NULL') 
        $rules = self::$rules;
        $rules['email'] = sprintf($rules['email'], $id);
        return $rules;
    

【讨论】:

以上是关于Laravel 4 表单验证在更新表单上应该是唯一的,但如果是当前的则不是的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 验证在更新相同的唯一值时抛出错误

Laravel 5.4 表单请求唯一验证:如何访问 id?

Laravel 在商店和更新上的表单请求验证使用相同的验证

Laravel 5.3 验证唯一

Laravel 4 验证唯一(数据库)忽略当前

laravel 表单验证 多个字段组合后唯一