软硬删除助手

为了简化数据删除操作,系统引入了快捷删除助手 DeleteHelper,它能够根据提交的数据自动执行软删除或硬删除操作。通过这一优化,开发者无需编写繁琐的删除逻辑,只需简单调用 DeleteHelper 即可实现高效、安全的数据删除。

在模型层面,如果需要在模型中使用 DeleteHelper,模型需要继承自 \think\admin\Model 类。这一改动确保了模型能够利用 DeleteHelper 提供的快捷删除功能,简化了删除操作的实现过程。

在控制器层面,如果控制器需要使用 DeleteHelper,控制器需要继承自 \think\admin\Controller 类。通过继承这个基类,控制器能够方便地调用 DeleteHelper 提供的方法,实现数据的快速删除。

调用快捷删除助手非常简单,只需在控制器中调用相应的方法并传入必要的参数即可。DeleteHelper会根据提交的数据自动判断执行软删除还是硬删除操作,确保数据的正确性和安全性。

此外,为了进一步提高数据删除的安全性,建议在删除操作前进行必要的数据验证和权限检查。通过结合验证器和权限控制机制,可以有效防止非法删除操作的发生,保护数据的完整性和安全性。

调用快捷删除

// 1.0 模型用法
// 参数 $field 主键字段,默认自动获取
// 参数 $where 限制条件,安全筛选删除
MyModel::mDelete(string $field, array $where);

// 1.1 模型通用删除
MyModel::mDelete();

// 1.2 指定数据主键
MyModel::mDelete('code');

// 1.3 指定数据主键,指定限定条件
MyModel::mDelete('code', [
    'uuid'    => $this->uuid,
    'deleted' => 0,
]);


// 2.0 控制器用法
// 参数 $dbQuery 模型名称
// 参数 $field 主键字段,默认自动获取
// 参数 $where 限制条件,安全筛选删除
$this->_delete($dbQuery, string $field, array $where);

// 2.1 控制器通用删除
$this->_delete('MyModel');

// 2.2 指定数据主键
$this->_delete('MyModel', 'code');

// 2.3 指定数据主键,指定限定条件
$this->_delete('MyModel', 'code', [
    'uuid'    => $this->uuid,
    'deleted' => 0,
]);

永久 & 硬删除

如果数据表中不存在is_deleteddeleted字段,则为硬删除。

标记 & 软删除

当前数据表中存在is_deleteddeleted字段时,调用DeleteHelper则自动为软删除操作,在列表查询搜索时加上对应的条件就可以显示需要的数据列表。

快捷删除案例

为了进一步提升数据删除操作的灵活性和扩展性,系统引入了自定义处理回调函数的功能。当执行数据删除操作时,系统会根据规则自动调用相应的回调函数进行结果处理。

具体的回调函数规则为:[_ACTION]_delete_result。其中 [_ACTION] 代表了执行的具体动作,例如,如果执行的是访问方法名,方法访问为 remove 那么 [_ACTION] 会被替换为 _remove。这样,根据删除类型的不同,系统会自动调用对应的回调函数。

通过定义这些回调函数,开发者可以在数据删除后对结果进行自定义处理。例如,可以在软删除后记录日志、发送通知,或者在硬删除后清理相关缓存、触发其他业务逻辑等。这一功能为开发者提供了更大的灵活性和控制力,使得数据删除后的处理更加符合业务需求。

此外,系统还提供了默认的回调函数实现,以确保在没有自定义处理逻辑时,系统仍然能够正常处理删除结果。这样,开发者可以根据自己的需求选择是否实现自定义的回调函数。

综上所述,通过引入自定义处理回调函数的功能,系统进一步增强了数据删除操作的灵活性和可扩展性,为开发者提供了更加个性化、高效的数据删除体验。

下面提供一个完整的 demo

/**
 * 删除系统权限
 * @auth true
 */
public function remove()
{
    // 表单令牌,为防止重复操作,前端使用 data-csrf='{:systoken("remove")}'生成 token
    $this->applyCsrfToken();
    // MyModel::mDelete();
    $this->_delete('MyModel');
}

/**
 * 删除结果处理
 * @param boolean $result
 * @throws \think\Exception
 * @throws \think\exception\PDOException
 */
protected function _remove_delete_result($result)
{
    if ($result) {
        $where = ['auth' => $this->request->post('id')];
        $this->app->db->name('SystemAuthNode')->where($where)->delete();
        $this->success("权限删除成功!", '');
    } else {
        $this->error("权限删除失败,请稍候再试!");
    }
}

如果是在 ThinkAdmin 后台基于 admin.js 的情况下,可台使用 data-action 来与 DeleteHelper 配合使用。

前端提交上来的主键值支持多个,以英文逗号分隔。表单 CSRF 根据后台是否开启表单令牌而决定要不要配置使用。

批量删除操作列表时,前端使用 data-action='{:url("remove")}' data-csrf="{:systoken('remove')}" data-rule="id#{key}"

这里面的 {key} 会自动搜索表格已经选择的 checkbox 的值,通常是数据记录的 id 组合值。

Last Updated:
Contributors: 邹景立