本文由 FlintHub 开发文档归档发布。原始文档日期见标题前缀,来源:7月5日复制的资料/SQL一致性迁移计划.md。
SQL 一致性迁移计划
现状
Controller 中散落约 100+ 处 直接 SQL 调用($db->query() / $db->fetchAll() / $db->fetchOne()),Helper 中也有少量。目标是:所有 SQL 统一封装在 Helpers 中,Controller 只调用 Helpers 方法,不出现 $db->。
原则
- 不改功能,只搬家 — 每条 SQL 原样搬进 Helper,不改逻辑
- 不改 Helper 原有方法签名 — 已在外被调用的方法保持兼容
- 每次只动一个 Controller — 改完测完再改下一个
- 插件不受影响 — Helper 公开方法不变
第一阶段:已有的 Helper 补充收尾(1-2 天)
当前 Helpers 已覆盖大部分业务,只需要把 Controller 里散落的同类 SQL 收进来。
| 文件 | 已有 Helper | Controller 中需要搬入的 SQL |
|---|---|---|
Controllers/ForumController.php | 无 Forum Helper | 统计各版块主题数/帖子数 → 新建 Forum.php Helper |
Controllers/HomeController.php | Settings::getTotalXxx() | 标签云、在线用户列表 → 搬入 Settings.php 或 Tag.php |
Controllers/ProfileController.php | Auth::getCurrentUser() | 用户帖子/积分统计 → 搬入 app/Models/User.php |
Controllers/AuthController.php | Auth.php | 注册/登录/RememberMe 已基本封装,少量漏网 SQL 并入 |
第二阶段:Admin Controllers 专项(3-5 天)
后台 Controller 是 SQL 重灾区,按顺序处理:
| 优先级 | Controller | SQL 数量 | 说明 |
|---|---|---|---|
| ⭐⭐⭐ | Admin/UserController.php | ~25 处 | "删除用户"的级联清理 SQL 最多,搬到 Auth.php 或新建 AdminHelper.php |
| ⭐⭐⭐ | Admin/MaintenanceController.php | ~12 处 | 重建索引/清理附件等运维 SQL,搬到 Settings.php |
| ⭐⭐ | Admin/LevelController.php | ~10 处 | 等级 CRUD,搬到 Points.php |
| ⭐⭐ | Admin/CategoryController.php | ~7 处 | 版块 CRUD,搬到 app/Models/Category.php |
| ⭐⭐ | Admin/BlogController.php | ~8 处 | 博客分类 CRUD,搬到 app/Models/BlogCategory.php |
| ⭐ | Admin/TagController.php | ~6 处 | 标签 CRUD,搬到 Tag.php(已有) |
| ⭐ | Admin/ThreadController.php | ~7 处 | 后台主题管理,搬到 app/Models/Thread.php |
| ⭐ | Admin/DashboardController.php | ~3 处 | 仪表盘统计,已基本干净 |
第三阶段:前端 Controller 收尾(2-3 天)
| Controller | SQL 数量 | 目标 Helper |
|---|---|---|
ThreadController.php | ~5 处 | 附件查询 → app/Models/Attachment.php(如已删则放 Settings::handleAttachments() 旁) |
PostController.php | ~2 处 | 分类存在性检查 → Category.php |
ApiController.php | ~4 处 | 内容存在性检查 → 合并到 Vote.php |
SearchController.php | ~1 处 | 用户搜索 → Search.php |
迁移示例
以一个典型迁移为例:
// 改前 — ThreadController.php
$categories = $db->fetchAll('SELECT * FROM categories ORDER BY sort_order ASC');
// 改后 — ThreadController.php
$categories = (new \app\Models\Category())->allOrdered();// 改前 — Admin/UserController.php
$adminCount = $db->fetchOne("SELECT COUNT(*) as cnt FROM users WHERE role = 'admin'");
// 改后 — Auth.php 加一个方法
public static function getAdminCount(): int
{
$db = \app\Core\Database::getInstance();
$r = $db->fetchOne("SELECT COUNT(*) as cnt FROM users WHERE role = 'admin'");
return (int)($r['cnt'] ?? 0);
}
// Controller 调用
$adminCount = \app\Helpers\Auth::getAdminCount();检验标准
每个 Controller 迁移完成后:
- 全文搜索该 Controller,确认 零处
$db->query(/$db->fetchAll(/$db->fetchOne(/$db->exec( - 手动跑一遍对应页面的所有操作(列表、新增、编辑、删除)
- 检查是否有
Undefined method错误
全部完成后搜一次:
grep -r "\$db->query\|->fetchAll\|->fetchOne" app/Controllers/结果应该为空。
总工作量估计
| 阶段 | 文件数 | 预估工时 |
|---|---|---|
| 第一阶段 | 4 个 | 1-2 天 |
| 第二阶段 | 8 个 | 3-5 天 |
| 第三阶段 | 4 个 | 2-3 天 |
| 合计 | 16 个文件 | 6-10 天 |
每天改 2-3 个 Controller,两周内可全部完成。不着急的话,一天改一个,一个月收工。