概述

Thinkphp5.1开发项目时,Model层用了tp封装的Db类,因为不想每个方法都写db::name("manage_tag");,于是我在构造 __construct 内赋值给了变量db; 在我执行更新时,我会先去调用isRepeat()判断内容是否重复,于是就出现了下面的问题,

问题

更新时,where条件多出name="xxxx";


    public $db;
    public function __construct()
    {
        $this->db = Db::name('manage_tag');
    }
    public function editTag(int $id,String $name)
	{
		$result =  $this->db->where('id', $id)->fetChSql()->update(['name' => $name]);
		
		var_dump($result);
		 return $result ? true : false;
	}
	
	public function isRepeat(String $name)
	{
		$result = $this->db->where('name',$name)->find();
        
        return $result ? true : false;
	}

使用fetChSql()方法查看打印sql

UPDATE `yh_manage_tag`  `name` = '标签11321' , `update_time` = 1621046891  WHERE  `name` = '标签11321'  AND `id` = 1

解决

查阅Thinkphp5.1的文档, 查询对象在查询之后仍然会保留链式操作的值,除非你调用removeOption方法清空链式操作的值。 在调用单独的查询方法时,使用removeOption();清除之前操作保留的值

    public function isRepeat(String $name)
    {
        $result = $this->db->where('name',$name)->find();
        $this->db->removeOption(true);
		
        return $result ? true : false;
    }

再次打印更新sql出来

UPDATE `yh_manage_tag`  SET `name` = '标签11321' , `update_time` = 1621047382  WHERE  `id` = 1