TP5中update时避免验证字段重复的解决方法

比如当你修改一个前台轮播图的信息,其他信息要修改后,只有排序这个关键字段不需要修改(排序在数据库中字段为Sort,字段数据为1、2、3、4),但是在验证里边写了unique验证规则(排序不能重复),那么此时修改某条信息时就会显示排序不能重复的在验证器里写自定义的报错信息(此处排序就是前台轮播图要显示的顺序),但是此时不需要改当前的排序。此时删掉整条信息再添加会很不友好,如果在更新时的验证场景中去掉unique这个规则的话,那么当需要改排序的时候就会没有这个验证规则,就会容易造成修改的排序与现有的排序产生冲突。此时,只要加一个条件判断即可解决以上问题:

		     public function update()
			{		
				$id=input('id');
			 	$services=db('services')->find($id);//获取一条数据	
			 	$this->assign('services',$services);//把获取的数据分配到模板中的$services
			 	
				if(request()->isPost())//request判断是否表单已经提交过来,如果是POST表单提交过来的,就要处理数据,记得要加return
				{
					if(input('sort')==$services['Sort'])//此时接收的sort和数据库中当前记录是一样的,即该操作没有修改排序,只是修改了除sort(排序)外的其他字段,那么此时就把该字段单独拉出来做一个判断,这样就解决了unique的唯一性验证
					{
						$data=[
						'Id'=>input('id'),
						'Title'=>input('title'),
						'Summary'=>input('summary'),
						'Content'=>input('content'),
						];
						$validate = new Validateuser;
						if(!$validate->scene('update2')->check($data))
						{
							$this->error($validate->getError());die;
						}
						if(db('services')->update($data))//此处把Id写到了data数组里,所以此处省略了where
						{
							return redirect('services');
						}else{
							$this->error('修改前台服务信息失败');
						}
						 return ;//加一个return将不再显示下面的语句
					}else{
						$data=[
						'Id'=>input('id'),
						'Sort'=>input('sort'),
						'Title'=>input('title'),
						'Summary'=>input('summary'),
						'Content'=>input('content'),
						];
						$validate = new Validateuser;
						if(!$validate->scene('update')->check($data))
						{
							$this->error($validate->getError());die;
						}
						if(db('services')->update($data))//此处把Id写到了data数组里,所以此处省略了where
						{
							return redirect('services');
						}else{
							$this->error('修改前台服务信息失败');
						}
						 return ;//加一个return将不再显示下面的语句
						}
					}
					 	return $this->fetch('update');	 
			}

思想大概如下:因为修改时整条记录都修改,而其中有些关键字是不能重复的(由于unique的唯一性验证)

,所以避免该问题的方法就是把作为unique的验证的关键字段单独拉出来,

加一条if语句(如果是多个,那就是多条if语句的问题),

如果该字段需要修改时就把该字段放入提交的数组中,如果不需要修改是在数组中就不用再加入该字段

。也就是在更新时提交的数组中加与不加该关键字段的问题。

如果大家有好的想法或更好的解决方法,欢迎交流学习。

你可能感兴趣的:(TP5技术总结,PHP,TP5技术总结)