关于tp5的软删除出现的问题
测试软删除时出现了一些小问题。
model下user.php文件中
<?php namespace appindexmodel; use thinkModel; use traitsmodelSoftDelete; class User extends Model { use SoftDelete; protected $deleteTime = "delete_time"; }
controller下user.php文件中
<?php namespace appindexcontroller; use appindexmodelUser as UserModel; use thinkController; class User extends Controller { public function del() { UserModel::destroy(1); // $user = new UserModel(); // dump($user->select()); // $user = UserModel::get(2); //$user->delete(); //软删除的原理是找到delete_time 字段 如果这个字段不是null 就会判断这个字段已经被删除 所以::get()的时候就不会返回 } }出现的问题是进行软删除后数据库的delete_time字段没有反应,正常情况下软删除后会更新数据为一个时间戳。经过测试发现,在model中加上use SoftDelete;后直接查询数据库数据查询不到,结果为null,因此等同于软删除操作的对象不存在而导致软删除不成功。
在各种论坛搜索软删除相关的问题没有找到应对此问题的直接方案。
最后发现实际上是数据库的问题,开发文档有明确说明: ThinkPHP5 的软删除功能使用时间戳类型(数据表默
认值为 Null ),用于记录数据的删除时间。
其实软删除的原理是根据标识字段的值来判断数据是否是被删除了,只有NULL是唯一作为数据没有被执行删除操作的标识。我出现问题的原因还是字段默认值的问题,为0,因此也被视作是删除状态,所以查询不到。
我认为测试是否是上述原因导致的数据查询问题的办法之一,可以是通过UserModel::withTrashed()->select();或者UserModel::onlyTrashed()->select();去查询软删除后的数据(前者为包含软删除后的数据,后者为仅查询软删除后的数据),如果此时可以查询到数据,那么虽然delete_time字段值不是时间戳,实际上这个数据已经默认视作被删除,可能就是字段值不为null的原因。
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。
- 上一篇: C#转换Base64编码,解码的URL
- 下一篇: model补充打开tp5自带的过滤和自动写入时间戳