Laravel中表单验证里unique在update时怎么排除当前记录

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Laravel中表单验证里unique在update时怎么排除当前记录相关的知识,希望对你有一定的参考价值。

参考技术A 首先确认,后台的用户表,我设计表叫做badmin,每个管理员有用户名(username),有昵称(nickname),有邮箱(email),有密码(password)这里玩个花,使用laravel的migration来建立表(实际上可以用不着使用这个工具建立表)1安装好最基本的laravel框架2创建migration文件:./artisanmigrate:makecreate-badmin-table3发现app/database/migration/下面多了一个php文件:2014_10_19_090336_create-badmin-table.php4往up和down里面增加内容;increments('id’);$table->string(‘nickname',100)->unique();$table->string('username',100)->unique();$table->string('email',100)->unique();$table->string('password',64);$table->timestamps(););/***Reversethemigrations.**@returnvoid*/publicfunctiondown()Schema::drop('badmin’);5配置好local的database,app/config/local/database.phpPDO::FETCH_CLASS,'default'=>'mysql','connections'=>array('mysql'=>array('driver'=>'mysql','host'=>'localhost','database'=>'test','username'=>'yejianfeng','password'=>'123456','charset'=>'utf8','collation'=>'utf8_unicode_ci','prefix'=>'',),),'migrations'=>'migrations',);6创建数据表:./artisanmigrate--env=local这个时候去数据库看,就发现多了一张badmin表,数据结构如下:CREATETABLE——badmin——(——id——int(10)unsignedNOTNULLAUTO_INCREMENT,——nickname——varchar(100)COLLATEutf8_unicode_ciNOTNULL,——username——varchar(100)COLLATEutf8_unicode_ciNOTNULL,——email——varchar(100)COLLATEutf8_unicode_ciNOTNULL,——password——varchar(64)COLLATEutf8_unicode_ciNOTNULL,——created_at——timestampNOTNULLDEFAULT'0000-00-0000:00:00',——updated_at——timestampNOTNULLDEFAULT'0000-00-0000:00:00',PRIMARYKEY(——id——),UNIQUEKEY——badmin_nickname_unique——(——nickname——),UNIQUEKEY——badmin_username_unique——(——username——),UNIQUEKEY——badmin_email_unique——(——email——))ENGINE=InnoDBAUTO_INCREMENT=2DEFAULTCHARSET=utf8COLLATE=utf8_unicode_ci;要问这里为什么多出了create_at和update_at,这是laravel默认为每个表创建的字段,而且在使用Eloquent进行增删改查的时候能自动更新这两个字段7创建个Model:'require|alpha_num|min:2','username'=>'require','email'=>'required|email|unique:users','password'=>'required|alpha_num|between:6,12|confirmed',];这里必须要implementsUserInterface和RemindableInterface8把model和Auth关联上,修改app/config/auth.php'eloquent',//只有驱动为eloquent的时候才有用'model'=>'Badmin',);这里的driver可以是eloquent或者database,使用eloquent就告诉Auth组件说,用户认证类是Badmin这个类管的。这里的model是有命名空间的,就是说如果你的admin类是\Yejianfeng\Badmin,这里就应该改成‘\Yejianfeng\Badmin'9好了,这个时间其实逻辑部分已经搭建完毕了,你已经可以在controller种使用Auth::attempt(XXX)做权限认证Auth::user()获取登录用户(一个Badmin类)等。10下面要建立一个用户登录页面:11设置路由:'user.login','uses'=>'UserController@getLogin']);Route::get('user/login',['as'=>'login','uses'=>'UserController@getLogin']);Route::post('user/login',['as'=>'login','uses'=>'UserController@postLogin']);//需要登录验证才能操作的接口Route::group(array('before'=>'auth’),function()Route::get(‘user/logout',['as'=>'logout','uses'=>'UserController@getLogout']);Route::get('user/dashboard',['as'=>'dashboard','uses'=>'UserController@getDashboard']););12设置controller:Input::get('email’),'password'=>Input::get(‘password’))))returnRedirect::to(‘user/dashboard’)->with(‘message',’成功登录‘);elsereturnRedirect::to('user/login’)->with(‘message',’用户名密码不正确‘)->withInput();//登出publicfunctiongetLogout()Auth::logout();returnRedirect::to('user/login’);publicfunctiongetDashboard()returnView::make(‘user.dashboard’);//添加新用户操作publicfunctiongetCreate()returnView::make(‘user.create’);//添加新用户操作publicfunctionpostCreate()$validator=Validator::make(Input::all(),User::$rules);if($validator->passes())$bAdmin=newBadmin();$bAdmin->nickname=Input::get(‘nickname’);$bAdmin->username=Input::get(‘username’);$bAdmin->email=Input::get(‘email’);$user->password=Hash::make(Input::get(‘password’));$user->save();Response::json(null);elseResponse::json(['message'=>‘注册失败'],410);13设置下filter,app/filter.phpRoute::filter('auth',function()if(Auth::guest())if(Request::ajax())returnResponse::make('Unauthorized',401);elsereturnRedirect::guest('/’););将这里认证失败后的地址转到/路径14设置views/user/login.blade.php

表单请求验证中的 Laravel“独特”自定义消息验证

【中文标题】表单请求验证中的 Laravel“独特”自定义消息验证【英文标题】:Laravel "unique" Custom Message Validation in Form Request Validation 【发布时间】:2019-11-27 13:35:04 【问题描述】:

我创建了表单请求验证,但在为多个“唯一”验证器自定义自定义验证消息时遇到问题

我创建了文档中说的函数,但是它没有显示我的消息,而是显示默认消息(电子邮件:[“电子邮件已被占用。”])

/**
 * Get the validation rules that apply to the request.
 *
 * @return array
 */
public function rules()

    return [
        'email' => "required|string|email|unique:table1,email|unique:table2,email"
    ];


/**
 * Get the error messages for the defined validation rules.
 *
 * @return array
 */
public function messages()

    return [
        "email.unique:table1,email" => "Error message for table 1",
        "email.unique:table2,email" => "Completely different error message for table 2"
    ];

如果我使用,我可以输出自定义结果:

public function messages()

    return [
        "email.unique" => "Same message for table 1 and table 2 error messages" 
    ];

但这不是我想要的,我想单独自定义消息,我应该怎么做?

【问题讨论】:

我认为你需要两个不同的请求 @MateusJunges 你所说的两个不同的请求是什么意思? 【参考方案1】:

你不能用这个:

public function messages()

    return [
        "email.unique:table1,email" => "Error message for table 1",
        "email.unique:table2,email" => "Completely different error message for table 2"
    ];

您无法通过表名来区分这两个唯一规则。

我的建议:

您可以创建自己的自定义验证规则 (check the docs) 以应用 unique:table1unique:table2,名称不同(例如:unique_first_table 和 unique_second_table)。然后你可以这样做:

$messages = [
    'email.unique_table_1' => 'Error message for table 1',
    'email.unique_table_2' => 'Completely different error message for table 2',
];

自定义验证规则:

在您的 AppServiceProvider 文件中,输入以下代码:

use Validator;

//In the boot method:
Validator::extend('unique_table_1', function ($attribute, $value, $parameters, $validator) 
    if(ModelFirstTable::where('email', $value)->count() > 0)
        return false;
    return true;
);

Validator::extend('unique_table_2', function ($attribute, $value, $parameters, $validator) 
    if(ModelSecondTable::where('email', $value)->count() > 0)
        return false;
    return true;
);

ModelFirstTableModelSecondTable 必须分别替换为您的第一个和第二个表的模型名称。

然后,在您的表单请求中使用它:

public function rules()

    return [
        'email' => "required|string|email|unique_table_1|unique_table_2"
    ];


public function messages()

     return [
        "email.unique_table_1" => "Error message for table 1",
        "email.unique_table_2" => "Completely different error message for table 2"
    ];

希望对你有帮助。

【讨论】:

谢谢!这是工作! 很高兴能帮到你!

以上是关于Laravel中表单验证里unique在update时怎么排除当前记录的主要内容,如果未能解决你的问题,请参考以下文章

表单请求验证中的 Laravel“独特”自定义消息验证

Laravel 表单验证器错误

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

laravel5.5表单验证

Laravel 5.3 验证唯一

具有唯一字段的 Laravel 验证服务