thinkphp使用Db类避坑之重复查询条件

文章发布于 2023-08-17

thinkphp5.1 使用Db类避坑之重复查询条件

重复查询条件

在5.1版本之后,如果使用同一个数据库查询对象实例,查询条件是不会被清空的,可能导致查询的数据异常。下面看看多个查询使用同一个数据对象实例的实例:

//数据库对象实例
$user = Db::name('user')

//查询今年注册用户数
$count = $user->where('create_time','>=','2023-01-01 00:00:00')->count();

// 查询king用户信息
$king = $user->where('name','king')->fetchSql(true)->find();

    

打印$king的sql后发现,查询king用户信息时,多了一个create_time>= 2023-01-01 00:00:00条件,它是查询用户注册数时使用的条件。所以当使用同一个数据库查询对象时,后面的sql查询会重复使用前面的条件。

"SELECT * FROM `user` WHERE  `create_time` >= 2023-01-01 00:00:00  AND `name` = 'king' LIMIT 1"

清空查询条件

如果使用同一个数据库查询对象实例,则需要先删除前面的查询条件。

$user->removeOption('where'); 清除where的查询条件。

$user->removeOption(); 清空所有的查询条件 ,例如 where、group、order 等等。

//数据库对象实例
$user = Db::name('user')
// 在执行查询时,先清空之前的查询条件。
$count = $user->where('create_time','>=','2023-01-01 00:00:00')->count();
$user->removeOption('where'); //清空上面的where条件
$king = $user->where('name','king')->fetchSql(true)->find();