123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200 |
- <?php
- namespace traits\model;
- use think\Collection;
- use think\db\Query;
- use think\Model;
- /**
- * @mixin \Think\Model
- */
- trait SoftDelete
- {
- /**
- * 判断当前实例是否被软删除
- * @access public
- * @return boolean
- */
- public function trashed()
- {
- $field = $this->getDeleteTimeField();
- if ($field && !empty($this->data[$field])) {
- return true;
- }
- return false;
- }
- /**
- * 查询包含软删除的数据
- * @access public
- * @return Query
- */
- public static function withTrashed()
- {
- return (new static )->getQuery();
- }
- /**
- * 只查询软删除数据
- * @access public
- * @return Query
- */
- public static function onlyTrashed()
- {
- $model = new static();
- $field = $model->getDeleteTimeField(true);
- if ($field) {
- return $model->getQuery()->useSoftDelete($field, ['not null', '']);
- } else {
- return $model->getQuery();
- }
- }
- /**
- * 删除当前的记录
- * @access public
- * @param bool $force 是否强制删除
- * @return integer
- */
- public function delete($force = false)
- {
- if (false === $this->trigger('before_delete', $this)) {
- return false;
- }
- $name = $this->getDeleteTimeField();
- if ($name && !$force) {
- // 软删除
- $this->data[$name] = $this->autoWriteTimestamp($name);
- $result = $this->isUpdate()->save();
- } else {
- // 强制删除当前模型数据
- $result = $this->getQuery()->where($this->getWhere())->delete();
- }
- // 关联删除
- if (!empty($this->relationWrite)) {
- foreach ($this->relationWrite as $key => $name) {
- $name = is_numeric($key) ? $name : $key;
- $result = $this->getRelation($name);
- if ($result instanceof Model) {
- $result->delete();
- } elseif ($result instanceof Collection || is_array($result)) {
- foreach ($result as $model) {
- $model->delete();
- }
- }
- }
- }
- $this->trigger('after_delete', $this);
- // 清空原始数据
- $this->origin = [];
- return $result;
- }
- /**
- * 删除记录
- * @access public
- * @param mixed $data 主键列表(支持闭包查询条件)
- * @param bool $force 是否强制删除
- * @return integer 成功删除的记录数
- */
- public static function destroy($data, $force = false)
- {
- if (is_null($data)) {
- return 0;
- }
- // 包含软删除数据
- $query = (new static())->db(false);
- if (is_array($data) && key($data) !== 0) {
- $query->where($data);
- $data = null;
- } elseif ($data instanceof \Closure) {
- call_user_func_array($data, [ & $query]);
- $data = null;
- }
- $count = 0;
- if ($resultSet = $query->select($data)) {
- foreach ($resultSet as $data) {
- $result = $data->delete($force);
- $count += $result;
- }
- }
- return $count;
- }
- /**
- * 恢复被软删除的记录
- * @access public
- * @param array $where 更新条件
- * @return integer
- */
- public function restore($where = [])
- {
- if (empty($where)) {
- $pk = $this->getPk();
- $where[$pk] = $this->getData($pk);
- }
- $name = $this->getDeleteTimeField();
- if ($name) {
- // 恢复删除
- return $this->getQuery()
- ->useSoftDelete($name, ['not null', ''])
- ->where($where)
- ->update([$name => null]);
- } else {
- return 0;
- }
- }
- /**
- * 查询默认不包含软删除数据
- * @access protected
- * @param Query $query 查询对象
- * @return Query
- */
- protected function base($query)
- {
- $field = $this->getDeleteTimeField(true);
- return $field ? $query->useSoftDelete($field) : $query;
- }
- /**
- * 获取软删除字段
- * @access public
- * @param bool $read 是否查询操作(写操作的时候会自动去掉表别名)
- * @return string
- */
- protected function getDeleteTimeField($read = false)
- {
- $field = property_exists($this, 'deleteTime') && isset($this->deleteTime) ?
- $this->deleteTime :
- 'delete_time';
- if (false === $field) {
- return false;
- }
- if (!strpos($field, '.')) {
- $field = '__TABLE__.' . $field;
- }
- if (!$read && strpos($field, '.')) {
- $array = explode('.', $field);
- $field = array_pop($array);
- }
- return $field;
- }
- }
|