ThinkPHP 您现在的位置是:首页 > 开发笔记 > ThinkPHP

Trait和软删除

来源:惠达浪原创 发布时间:2019-05-21 最后更新:2019-05-21 8039已围观

摘要前不久,使用ThinkPHP 5.1中的软删除时,发现并不是太好用,于是对软删除做了进一步的研究,总结出一些经验和技巧,在这里记录一下。在技巧中,关于trait的应用引起了我的注意。

ThinkPHP 5 的软删除

上边说完了 trait,就来看看软删除吧。为什么要软删除呢?下边是ThinkPHP官方给出的理由:

在实际项目中,对数据频繁使用删除操作会导致性能问题,软删除的作用就是把数据加上删除标记,而不是真正的删除,同时也便于需要的时候进行数据的恢复。

软删除其实还是挺科学的,比如有一个员工离职了,如果你真的把他删除了,那么以前他做过的订单(外键)岂不全都作废了?通常都是打上一个标记,表示此人已经离职,但记录还是能查到的。软删除类似于此,但不是为了解决主外键问题,主要还是为了还原,至少我是这样认为的。

但是,无论是ThinkPHP 5.0.x 还是 5.1.x,都存在一个问题,就是删除时间字段不能是not null的,因为读取的时候,默认条件是is null,这就讨厌了,因为我隐约记得MySQL优化中有一条,就是尽可能是让字段不为null,多少给个默认值。所以我的时间字段都是默认为 0。5.1.9以上版本倒是解决了这个问题,在模型中添加属性:

protected $defaultSoftDelete = 0;

但之前版本和5.0就不行了,所以,需要自己来写,这就是为什么要先学习 trait 的原因啦。

由于源码挺多的,不在这儿一一罗列了,就说说思路吧。思路就是重写旧方法里的那些条件,必要的时候,可以重写方法。自己再trait进模型中就可以了。对于 5.0 版本的 SoftDelete,有个 base() 方法,官方没有提,也没有资料,通过对 Model 的源码分析我找到了答案,它是用来获取全局作用域的,也就是说生成查询对象的时候,是会来调用 base() 方法的,因此你可以在自己的模型里,通过写一个base方法,来完成一些事物。不过,5.1以后,这个方法没了,也许是为了去掉耦合吧,我想。

很赞哦! (537)


站点信息

  • 网站平台ThinkCMF 5.1.5
  • PHP版本:7.3.31
  • QQ交流群: 惠达浪技术交流