今天帮一个朋友改一个业务系统的问题,这个系统是基于thinkphp5.1框架开发的,这个框架在国内的用户很多,是PHP领域一个不错的编程框架,之前也有过研究,不过目前框架结构和类库方法都是借鉴了laravel的思想,也基本上和市面上的主流框架一样,大量使用了容器、路由、中间件等设计方式,扩展也比较容易。
不过今天在朋友业务系统中一直碰到一个奇怪的问题,在将返回查询构造器的回调传入方法后,只要update数据,数据记录的自增主键id就变成了0,导致报错,经过断点后发现只要是Db类的find()方法调用后,如果立即调用update()方法就出现上诉情况。
后来仔细看了下源码,并跟踪了thinkphp5.1的Query类,发现只要在其update()方法调用前调用了find()方法,则$this→options['data']里面就自动有了一个健值['id'=>null],从而导致数据更新时自增主键id被更新为0,本想修改框架代码,但是考虑到朋友会更新升级框架,就换了一种写法,以避免被thinkphp的这个坑害死,下图是更换的一种写法。