Laravel 自定义表单验证-自定义验证规则
前言
现在客户表有2个手机字段(phone,server_phone),不管插入还是编辑都需要对2个手机号进行验证判重规则。但是如果用Laravel自己的unique规则的话,无法使用orWhere 方法。
Unique规则
:
select count ( * ) as aggregate from client where phone = '15706844651' and id <> '111111' and reserve_phone = '15706844651'
不符合在自己业务逻辑
步骤
建立自己的验证规则文件
<?php
namespace App\Validators;
use App\Models\Client\Client;
/**
* Class PhoneValidator.
*/
class UniquePhoneValidator
{
public function validate($attribute, $value, $parameters, $validator)
{
if($parameters){
return Client::where(function ($query) use ($value){
$query->where('phone',$value)->orWhere('server_phone',$value);
})->whereNotIn('id',$parameters)->withTrashed() ? false : true;
}
return Client::where(function ($query) use ($value){
$query->where('phone',$value)->orWhere('server_phone',$value);
})->withTrashed() ? false : true;
}
}
AppServiceProvider 中引入验证
protected $validators = [
'unique_phone' => UniquePhoneValidator::class,
];
public function boot()
{
$this->registerValidators();
}
protected function registerValidators()
{
foreach ($this->validators as $rule => $validator) {
Validator::extend($rule, "{$validator}@validate");
}
}
在FormRquest 里面中使用该规则
class MyClientRequest extends FormRequest
{
public function rules()
{
if($this->method() == 'POST'){
return [
'phone' => 'filled|int|unique_phone',
'reserve_phone' => 'filled|int|unique_phone',
];
} elseif ($this->method() == 'PUT'){
return [
'phone' => 'filled|int|unique_phone:'.$this->route('client'),
'reserve_phone' => 'filled|int|unique_phone,'.$this->route('client'),
];
}
}
}
本作品采用《CC 协议》,转载必须注明作者和本文链接
谢谢你的分享,给了我提示! 我现在要做的,自定义验证方法是: users表的两个字段:countrycode国别,phone手机号,的唯一性, 也可以理解为两个连在一起时是唯一的,比如:861890000001, 并且当国别为86时,对大陆手机号再进行正则验证。其他国家的就只要是数字即可。