虽然,thinkphp5的上述功能能够实现数据的软删除,但是,在实际数据库表设计中,经常是设置独立的字段表示当前记录的状态。如:status字段,或is_deleted字段。而该字段的数据类型也往往设计成“整形”或“字符型”,这就与thinkphp5中softdelete要求的类型不匹配。因此,给予以上的原因,本人对softdelete进行一些改进,能够实现记录当前记录的删除状态、删除时间信息。具体代码如下:
1 在softdelete中增加getDeleteField函数,提取需要设置记录删除状态的字段。
/**
* 获取软删除标记字段
* @access public
* @param bool $read 是否查询操作(写操作的时候会自动去掉表别名)
* @return string
*/
protected function getDeleteField($read = false)
{
$field = property_exists($this, 'deleteField') && isset($this->deleteField) ?
$this->deleteField : 'is_delete';
if (false === $field) {
return false;
}
return $field;
}
2 在delete函数中增加
$field=$this->getDeleteField();
3 修改delete函数中if功能
if (($name || $field) && !$force) {
if ($name){
// 原软删除处理逻辑
// 软删除
$this->data[$name] = $this->autoWriteTimestamp($name);
}
if ($field){
// 新增软删除处理逻辑
// 软删除
foreach ($field as $key=>$value){
$this->data[$key] = $value;
}
}
$result = $this->isUpdate()->save();
} else {
// 强制删除当前模型数据
$result = $this->getQuery()->where($this->getWhere())->delete();
}
4 在用户模型中设置
protected $deleteTime='delete_time';// 保存软删除时间字段
protected $deleteField=['is_delete'=>1];// 保存软删除状态字段及状态信息
5 使用方法不变
本人才疏学浅,初识thinkphp,难免有误,望各位见谅,并予以赐教,不胜感激。
最佳答案
