首先查看一下 validate 中 unique 方法
/**
* 验证是否唯一
* @access protected
* @param mixed $value 字段值
* @param mixed $rule 验证规则 格式:数据表,字段名,排除ID,主键名
* @param array $data 数据
* @param string $field 验证字段名
* @return bool
*/
protected function unique($value, $rule, $data, $field)
解释说明
$params = $this->request->post("row/a");
$rule1 = ['username' => 'require|unique:admin,username'];
$rule2 = ['username' => 'require|unique:admin,username,' . $pk];
$rule3 = ['username' => 'require|unique:admin,username^uniacid,' . $pk];
//unique:admin 第一个参数[admin] 表示在admin表中查找数据 检测SQL: db('admin')
//unique:admin,username 第二个参数[username] 表示在admin表中根据字段username查找数据
//检测SQL: db('admin')->where('username',$params['username'])->find();
//unique:admin,username^uniacid 第二个参数[username^uniacid] 如果第二个参数里面有^ 表示联合唯一
//检测SQL: db('admin')->where('username',$params['username'])->where('uniacid',$params['uniacid'])->find();
//unique:admin,username,$pk 第三个参数[$pk] 表示在admin表中根据字段username查找主键[id] 不等于 $pk 的数据
//检测SQL: db('admin')->where('username',$params['username'])->where('id','neq',$pk)->find();
//unique:admin,username^uniacid,$pk
//检测SQL: db('admin')->where('username',$params['username'])->where('uniacid',$params['uniacid'])->where('id','neq',$pk)->find();
使用案例
创建一条数据
$this->model = model('Admin');
$params = $this->request->post("row/a");
$uniacid = session('uniacid');
$params['uniacid'] = $uniacid;
$result = $this->model->validate('Admin.add')->save($params);
if ($result === false) {
$this->error($this->model->getError());
}
编辑一条数据
$params['uniacid'] = session('uniacid');
//这里需要针对username和email做唯一验证
$adminValidate = \think\Loader::validate('Admin');
$adminValidate->rule([
'username' => 'require|regex:\w{3,12}|unique:admin,username^uniacid,' . $row->id,
'email' => 'require|email|unique:admin,email^uniacid,' . $row->id,
'phone' => 'require|phone|unique:admin,phone^uniacid,' . $row->id,
]);
$result = $row->validate('Admin.edit')->save($params);
if ($result === false) {
$this->error($row->getError());
}
验证器 application/admin/validate/Admin.php
<?php
namespace app\admin\validate;
use think\Validate;
class Admin extends Validate
{
/**
* 验证规则
*/
protected $rule = [
'username' => 'require|regex:\w{3,12}|unique:admin,username^uniacid',
'nickname' => 'require',
'password' => 'require',
'email' => 'require|email|unique:admin,email^uniacid',
'phone' => 'require|phone|unique:admin,phone^uniacid',
];
/**
* 提示消息
*/
protected $message = [
];
/**
* 字段描述
*/
protected $field = [
];
/**
* 验证场景
*/
protected $scene = [
'add' => ['username', 'email', 'phone','nickname', 'password'],
'edit' => ['username', 'email', 'phone','nickname', 'password'],
];
public function __construct(array $rules = [], $message = [], $field = [])
{
$this->field = [
'username' => __('Username'),
'nickname' => __('Nickname'),
'password' => __('Password'),
'email' => __('Email'),
'phone' => __('Phone'),
];
$this->message = array_merge($this->message, [
'username.regex' => __('Please input correct username'),
'password.regex' => __('Please input correct password')
]);
parent::__construct($rules, $message, $field);
}
}
不使用验证器使用
$params['username'] = $this->request->post('username');
$rules = [
'username' => 'require|unique:admin,username',
];
$validate = new \think\Validate($rules);
$result = $validate->check($params);
if (!$result) {
$this->error($validate->getError());
}