php 数据库数据软删除
模型的改动
1,需要导入 use traits\model\SoftDelete;
2,在内部组合使用 use SoftDelete;
3,指定数据库软删除的标记字段 protected $deleteTime = 'delete_time';
4,(可选参数)指定标记字段的默认值 5.1 版本以上才有效 protected $defaultSoftDelete = 0;
namespace app\index\model;
use think\Model;
use traits\model\SoftDelete;
class User extends Model
{
use SoftDelete;
//定义数据表中软删除标记字段
protected $deleteTime = 'delete_time';
//5.1以上版本才有defaultSoftDelete属性,设置软删除字段的默认值,5.0的默认值为NULL
protected $defaultSoftDelete = 0;
}
逻辑内部使用
// 软删除 根据主键
User::destroy(1);
// 真实删除
User::destroy(1,true);
$user = User::get(1); ## 此处需要主要,如果是先使用模型查出数据再删除的话是软删除,若直接使用 delete 方法,则是真实删除,因为 thinkphp 由模型直接调用 delete 方法走的是数据库的 delete 方法
// 软删除
$user->delete();
// 真实删除
$user->delete(true);
默认情况下查询的数据不包含软删除数据,如果需要包含软删除的数据,可以使用下面的方式查询:
User::withTrashed()->find();
User::withTrashed()->select();
如果仅仅需要查询软删除的数据,可以使用:
User::onlyTrashed()->find();
User::onlyTrashed()->select();
注:软删除仅对模型的删除方法有效,如果直接使用数据库的删除方法则无效,例如下面的方式无效(将不会执行任何操作)。
User::where('id',1)->delete(); ### 因为此方法是直接调用的 数据库的 delete 方法,所以无法达到软删除的效果
根据 where 条件进行软删除
1, 通过 destroy 方式的闭包函数实现
$data = NewAModel::destroy(function($query) use ($key){
$query->where('key',$key);
});
通过上面方式可以对 NewAModel 模型数据进行 where 条件软删除
2,通过先获取,再删除实现软删除
$NewAModel = NewAModel::where('key',$key);
$NewAModel->delete();
3, 通过 destroy 的数组方式实现 where 条件的软删除
$data = NewAModel::destroy(['key'=>$key]);
建议
自己封装软删除方法,不要使用这个
原因:
无论是否成功删除数据,都是返回布尔值 true
无法判断是否成功删除数据