技术笔记php项目中软删除的实现思路 改造phalapi框架实现软删除
Xtong什么是软删除
软删除也叫逻辑删除,指在数据库中使用标记字段表示数据的删除状态,而不是正真删除数据。
为什么要用软删除
项目在生产环境中产生的数据,即使在业务上删除的数据,也有存在的意义,彻底的抹去这些已删除数据可能会对我们进行数据分析产生影响。
使用软删除保证了数据的完整性,另外在定位程序问题上也有一定的帮助。
实现思路
我的习惯是,在需要软删除的业务表中,加入以下4个字段:
1 2 3 4 5 6
| `status` tinyint(3) NOT NULL DEFAULT '1' COMMENT '状态(1正常,2更新,3删除)', `created_at` bigint(13) NOT NULL COMMENT '创建时间', `updated_at` bigint(13) NOT NULL COMMENT '最后更新时间', `deleted_at` bigint(13) NOT NULL COMMENT '删除时间',
|
然后在框架中,修改原来的对应数据库操作逻辑:
- add:增加当前时间戳(created_at/created)
- update:更新当前时间戳(updated_at/updated),更新status=2
- delete:更新当前时间戳(deleted_at/deleted),更新status=3
- 查询:增加查询条件
status<3
在PHP的phalapi框架下改造软删除的示例
原框架中没有内置软删除功能,我们需要修改框架的 DataModel 类中的方法来实现。
我们不要去直接修改 DataModel 类,而是创建一个 Model 类继承自 DataModel。
1
| class Model extends DataModel
|
然后重写以下的方法,让项目中的 业务表Model 继承于我们创建的这个 Model类。
- 插入 insert
- 更新 updateAll 和 update
- 自动更新更新时间 updated
- 自动更新数据状态 status = 2(已更新)
- 删除 deleteAll 和 deleteIds
- 原删除 delete 操作改为 更新 update 操作
- 自动更新删除时间 deleted
- 自动更新数据状态 status = 3(已删除)
- 查询 getList、getDataMoreBy、count
- 查询条件增加软删除状态过滤,status < 3 (已删除)
当然,修改完 Model 之后,别忘了每张数据表也都应该修改,必须包含status、created、updated、deleted
四个字段。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144
|
public function insert($data, $id = NULL) { $data['created'] = date('Y-m-d H:i:s'); $id = parent::insert($data, $id); return $id !== FALSE ? intval($id) : $id; }
public function updateAll($where, array $updateData) { $updateData['updated'] = date('Y-m-d H:i:s'); $updateData['status'] = Constant::STATUS_UPDATE; return $this->getORM()->where($where)->update($updateData); }
public function update($id, $data) { $updateData['updated'] = date('Y-m-d H:i:s'); $updateData['status'] = Constant::STATUS_UPDATE; return parent::update($id, $data); }
public function deleteAll($where) { $updateData['deleted'] = date('Y-m-d H:i:s'); $updateData['status'] = Constant::STATUS_DELETE; return $this->getORM()->where($where)->update($updateData); }
public function deleteIds($ids) { $updateData['deleted'] = date('Y-m-d H:i:s'); $updateData['status'] = Constant::STATUS_DELETE; return $this->getORM()->where('id', $ids)->update($updateData); }
public function getList($where = NULL, $whereParams = array(), $select = '*', $order = NULL, $page = 1, $perpage = 0) { $page = intval($page); $perpage = intval($perpage); $orm = $this->getORM();
$where['status < ?'] = Constant::STATUS_DELETE;
if (!empty($where) && !empty($whereParams)) { $orm->where($where, $whereParams); } else if (!empty($where)) { $orm->where($where); }
$select = is_array($select) ? implode(',', $select) : $select; $orm->select($select);
$order = is_array($order) ? implode(', ', $order) : $order; if (!empty($order)) { $orm->order($order); }
if ($perpage) { return $orm->page($page, $perpage)->fetchAll(); }
return $orm->fetchAll(); }
public function getDataMoreBy($field, $value, $limit = 0, $select = '*') { $orm = $this->getORM() ->select(is_array($select) ? implode(',', $select) : $select) ->where($field, $value) ->where('status < ?', Constant::STATUS_DELETE); $limit = intval($limit); if ($limit > 0) { $orm->limit(0, $limit); } return $orm->fetchAll(); }
public function count($where = NULL, $countBy = '*') { $orm = $this->getORM();
$where['status < ?'] = Constant::STATUS_DELETE;
if (!empty($where)) { $orm->where($where); }
$total = $orm->count($countBy); return intval($total); }
|