tp6中delete接口本质是响应http delete请求并执行删除逻辑,支持硬删、软删及条件删,需配置路由、校验权限、检查存在性并统一返回格式。

TP6 接口里用 DELETE 方法删除数据,本质是接收 HTTP DELETE 请求,再调用模型或数据库层执行删除逻辑。它不等于“必须用 RESTful 风格路由”,而是指后端接口响应 DELETE 请求动词,并完成对应的数据移除动作。关键在请求处理方式和删除策略选择:硬删、软删,还是带校验的条件删。
DELETE 请求怎么被 TP6 接收
TP6 默认支持标准 HTTP 方法映射。只需在路由定义中明确指定 DELETE 动词:
- 闭包方式:
Route::delete('user/:id', 'UserController@destroy'); - 资源路由(推荐):
Route::resource('user', 'UserController')->only(['destroy']);,自动生成DELETE /user/123路由 - 注意:若用 Nginx/Apache,需确保服务器未过滤 DELETE 方法;Swoole 或 Workerman 环境下通常无此限制
执行删除操作的两种主流方式
收到 DELETE 请求后,控制器方法里可选以下任一路径,取决于业务是否需要保留痕迹:
-
硬删除(物理删除):直接从表中移除记录
例如:UserModel::destroy($id);或Db::name('user')->where('id', $id)->delete();
返回影响行数,为 0 表示未找到或已删 -
软删除(假删):仅标记删除时间,查询自动过滤
前提:模型启用use SoftDelete;,并配置$deleteTime = 'delete_time';
调用同上:UserModel::destroy($id);—— 此时会写入delete_time值,而非删行
DELETE 接口的安全与健壮性要点
对外暴露删除接口,不能只写一行 destroy() 就完事。必须叠加必要控制:
-
权限校验:在中间件或控制器开头判断当前用户是否有权删该数据,例如:
if (!$user->canDelete($target)) { return json(['code'=>403, 'msg'=>'无权限']); } -
存在性检查:避免静默失败,先查再删更可控:
$user = UserModel::find($id); if (!$user) { return json(['code'=>404]); } $user->delete(); -
关联清理(可选):如删用户要同步清空其订单,需手动处理:
$user->orders()->delete();(硬删)或$user->orders()->withTrashed()->update(['delete_time'=>null]);(恢复关联) -
返回统一格式:成功建议返回
204 No Content(无响应体)或200 + {code:0, msg:'删除成功'},不要裸返布尔值
调试 DELETE 接口常见问题
发现删不动、没报错、数据库没变化?优先排查这三点:
- 看日志:开启
Db::enableQueryLog(),确认实际执行的 SQL 是DELETE FROM还是UPDATE SET delete_time=... - 查模型配置:
var_dump($model->getOptions()),确认soft_delete是否为 true,delete_time字段名是否匹配 - 验数据库字段:
DESCRIBE user;检查delete_time是否允许为 NULL;若设了 NOT NULL + 默认值,软删恢复会静默失败











