简单的小项目在自定义验证字段时,数据插入数据库可以正常验证!想要在数据更新时也使用本套验证方法,就是一个字段比如catename字段,需要验证是否存在,然后在数据库中是否是唯一一个.ThinkPHP5
以下自定义验证是代码:(很简单的)
class Admin extends validate
{
protected $rule = [
'catename' => 'unique:cate|require|length:4,25'
];
protected $message = [
'catename.require' => '请填写栏目名称',
'catename.unique' => '栏目已存在',
'catename.length' => '长度不在3-5个字符',
];
}
然后数据更新代码:model层
//栏目修改
public function edit($data)
{
$validate = new Admin();
if ($validate->check($data)) {//验证数据是否正确
$num = Cate::isUpdate(true)->save($data);
return $num;
} else {
return $validate->getError();
}
}
这里出现了一个问题:就是当我不做修改的时候数据是肯定修改失败的!因为没有做任何修改返回没有影响的行数!但是if判断那边他是执行的!也是执行成功的!就好比我修改的数据是"菜单栏",我不修改原样放进去它验证成功!我依稀记得更新操作都是先删除原始数据重新插入数据这样一个流程,那我判断唯一性就失效了!但是更新时我又要怎么判断他是否唯一呢!小白还请各位给点意见!
问题应该就是更新时的唯一性判定是要排除自身的。
我记得看过tp5验证这块的代码,要是单独在valide验证器类里是实现不了的,因为这个类里没找到怎么获取传递过来的参数。但是在controller中可以实现,但文档中根本没有细说,我在他们官方文档下面的评论中有具体的怎么实现的代码,可以参考下,或者帮忙贴过来。
自己贴过来吧:
文档太简陋了,还要看源码才行,
'name' => 'unique:user,status=1&account='.$data['account']
,这种的只能放在controller
中,自己来定义rule
和message
,在单独的validate
类中无法将相关的值传递过去。规则是:
unique:【模型类名(或表名)】,【要验证的字段(或者包含=号或者包含^号,但是必须把本身的条件加入,别以为前面有name了就不把name本身加进去了)】,【要排除的字段】,【主键(可不填)】
示例: