diff --git a/library/think/db/Builder.php b/library/think/db/Builder.php index 1fa2968a..414672d1 100644 --- a/library/think/db/Builder.php +++ b/library/think/db/Builder.php @@ -280,6 +280,13 @@ abstract class Builder $whereStr .= empty($whereStr) ? substr(implode(' ', $str), strlen($key) + 1) : implode(' ', $str); } + if (!empty($options['soft_delete'])) { + // 附加软删除条件 + list($field, $condition) = $options['soft_delete']; + + $whereStr = $whereStr ? '( ' . $whereStr . ' ) AND ' : ''; + $whereStr = $whereStr . $this->parseWhereItem($field, $condition, '', $options, $binds); + } return $whereStr; } diff --git a/library/think/db/Query.php b/library/think/db/Query.php index 1032944f..1534bf72 100644 --- a/library/think/db/Query.php +++ b/library/think/db/Query.php @@ -1120,6 +1120,20 @@ class Query return $this; } + /** + * 设置软删除字段及条件 + * @access public + * @param false|string $field 查询字段 + * @param mixed $condition 查询条件 + * @return $this + */ + public function useSoftDelete($field, $condition = null) + { + if ($field) { + $this->options['soft_delete'] = [$field, $condition ?: ['null', '']]; + } + } + /** * 分析查询表达式 * @access public diff --git a/library/traits/model/SoftDelete.php b/library/traits/model/SoftDelete.php index 2b97ff72..65f52e00 100644 --- a/library/traits/model/SoftDelete.php +++ b/library/traits/model/SoftDelete.php @@ -30,7 +30,7 @@ trait SoftDelete { $model = new static(); $field = $model->getDeleteTimeField(true); - return $model->db(false)->removeWhereField($field); + return $model->db(false); } /** @@ -42,7 +42,7 @@ trait SoftDelete { $model = new static(); $field = $model->getDeleteTimeField(true); - return $model->db(false)->whereNotNull($field); + return $model->db(false)->useSoftDelete($field, ['not null', '']); } /** @@ -112,12 +112,11 @@ trait SoftDelete { $name = $this->getDeleteTimeField(); if (empty($where)) { - $pk = $this->getPk(); - $where[$pk] = $this->getData($pk); - $where[$name] = ['not null', '']; + $pk = $this->getPk(); + $where[$pk] = $this->getData($pk); } // 恢复删除 - return $this->db(false)->removeWhereField($this->getDeleteTimeField(true))->where($where)->update([$name => null]); + return $this->db(false)->useSoftDelete($name, ['not null', ''])->where($where)->update([$name => null]); } /** @@ -129,7 +128,7 @@ trait SoftDelete protected function base($query) { $field = $this->getDeleteTimeField(true); - $query->whereNull($field); + $query->useSoftDelete($field); } /**