[开发]SQL 一致性迁移计划

👑Lv.11 元老 🌞 骨干会员
2026-10-23 23:53:59

本文由 FlintHub 开发文档归档发布。原始文档日期见标题前缀,来源:7月5日复制的资料/SQL一致性迁移计划.md。

SQL 一致性迁移计划

现状

Controller 中散落约 100+ 处 直接 SQL 调用($db->query() / $db->fetchAll() / $db->fetchOne()),Helper 中也有少量。目标是:所有 SQL 统一封装在 Helpers 中,Controller 只调用 Helpers 方法,不出现 $db->。


原则

  1. 不改功能,只搬家 — 每条 SQL 原样搬进 Helper,不改逻辑
  2. 不改 Helper 原有方法签名 — 已在外被调用的方法保持兼容
  3. 每次只动一个 Controller — 改完测完再改下一个
  4. 插件不受影响 — Helper 公开方法不变

第一阶段:已有的 Helper 补充收尾(1-2 天)

当前 Helpers 已覆盖大部分业务,只需要把 Controller 里散落的同类 SQL 收进来。

文件已有 HelperController 中需要搬入的 SQL
Controllers/ForumController.php无 Forum Helper统计各版块主题数/帖子数 → 新建 Forum.php Helper
Controllers/HomeController.phpSettings::getTotalXxx()标签云、在线用户列表 → 搬入 Settings.php 或 Tag.php
Controllers/ProfileController.phpAuth::getCurrentUser()用户帖子/积分统计 → 搬入 app/Models/User.php
Controllers/AuthController.phpAuth.php注册/登录/RememberMe 已基本封装,少量漏网 SQL 并入

第二阶段:Admin Controllers 专项(3-5 天)

后台 Controller 是 SQL 重灾区,按顺序处理:

优先级ControllerSQL 数量说明
⭐⭐⭐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 天)

ControllerSQL 数量目标 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 迁移完成后:

  1. 全文搜索该 Controller,确认 零处 $db->query( / $db->fetchAll( / $db->fetchOne( / $db->exec(
  2. 手动跑一遍对应页面的所有操作(列表、新增、编辑、删除)
  3. 检查是否有 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,两周内可全部完成。不着急的话,一天改一个,一个月收工。

轻量级、高性能、零 MySQL 依赖的PHP社区系统。
| 瀏覽 6 次 | 回覆 0 次

全部回覆 (0)

暫無回覆

請 登入