ThinkPHP5的软删除的常见问题和详解

tp5的软删除:
1、 使用:官方文档

use traits\model\SoftDelete;
class User extends Model
{
use SoftDelete;
protected  $deleteTime = 'delete_time';//必须
protected $updateTime = false;//必须
}

在这里官方文档说的不是很清楚,首先变量deleteTime是变量不影响(随便命名,但是一般不会更改),而字符串delete_time是数据库中的字段,也就是根据自己的需要设置的软删除标识字段。比如我的数据库的标识字段是‘recycle’.
所以:

$deleteTime = 'recycle';

这里的deleteTime是默认的删除标识字段,所以如果你的字段不是delete_time需要赋值给变量(自己定义标识字段),而数据类型为时间戳(timestamp),默认值是null。
而变量updateTime是false是为了关闭数据库更新操作的记录。这是tp框架的自带功能,默认是开启的。如果你的数据库中没有并且不打算做更新操作时记录更新时间的话可以选择关闭,赋值为false。如果不关闭而没有字段会报错“数据库中update_time字段不存在”。也就是说变量$updateTime是必须的,要么赋值false,关闭;要么赋值为你数据库中对应的字段。比如你数据库中有update_time字段用于记录更新时间,那么赋值为update_time.

protected $updateTime = 'update_time';
//或者
protected $updateTime = false;

这里的updateTime 是默认的更新、插入操作的记录字段,所以如果你的字段不是delete_time需要赋值给变量(自己定义标识字段),而数据类型为时间戳(timestamp),默认值是null。
以上2处数据库类型都是时间戳是tp框架的强制规定,也是为了方便存储和读取

配置文件:
在database.php中设置自动写入时间戳为true,默认是false。这里就可以和前面的时间戳数据类型对应。

// 自动写入时间戳字段
    'auto_timestamp'  => true,

2、 CURD操作。
软删除

withTrashed()//不管是不是在回收站中都遍历
onlyTrashed()//只遍历在回收站中的数据
而正常写的函数方法都只是在没有在回收站的数据中进行。

3、数据恢复
目前已知的只有一种方法,写原生sql语句。

$sql = ' update tablename set delete_time = NULL where id ='恢复的数据id' ' ;//delete_time是数据库中自定义的删除标识字段。
Db::excute($sql  );

软删除的原理就是根据标识字段的值来判断数据是否是被删除了而NULL是唯一作为数据没有被执行删除操作的标识,也就是说删除标识的列的值是NULL的数据是正常数据,只要不是NULL就是已进行过删除操作的数据,被放入的回收站。需要withTrashed或者onlyTrashed才能操作这些数据

所以根据以上得出一个不幸的结论,与其用框架自带的软删除功能,还不如自己写一个原生的软删除功能。只需要我门定义一个列列作为删除标识,当这个列的值为某个数字(或者某个字符)时就认为它是被进行过了删除操作,它被放入了回收站中,而其他的数据时则说明它没有在回收站中,在数据操作时添加一个where条件对数据进行一次筛选就能轻松搞定软删除的功能,而且使用起来还更为灵活。
当数据恢复时,也可以通过更新操作快速的执行,通过以上的对比,tp框架的软删除功能并没有我们想的那么高效和便捷。

你可能感兴趣的:(总结,ThinkPHP,web开发,后端开发,mysql数据库,thinkphp,软删除)