TP5.1老项目DAO层重构必须将硬编码SQL替换为模型层(继承think\Model)、逻辑层(封装规则)、数据访问层(统一连接事务)三层结构,否则无法适配KES等国产化中间件;模型须置于application/common/model目录、类名与表名严格对应、表前缀由配置统一控制,禁止硬编码;复杂查询改用关联预载而非raw SQL;KES适配需显式声明schema且删除MySQL专属函数。

TP5.1老项目重构DAO层时,必须将原有直连数据库、硬编码SQL、手动拼接条件的写法,替换成符合新数据库规范的分层结构——模型层负责数据映射与基础CRUD,逻辑层封装业务规则,数据访问层统一管理连接与事务,否则后续切换KES、适配国产化中间件或对接RabbitMQ异步解耦时,代码会反复返工甚至引发数据一致性事故。
第一步:确认模型类命名与目录归属
打开 application/common/model 目录,检查所有模型类是否继承 think\Model;若存在直接 new PDO() 或 Db::table() 的裸调用,必须删除并替换为模型实例。
模型类文件名必须与数据表名严格对应(如 user 表 → User.php),且类名首字母大写、无下划线;【表前缀不能写死在模型里】,例如 protected $table = 'tp_user' 是错误写法,应设为 protected $table = 'user',前缀由 config/database.php 中的 prefix 统一控制。
若原项目把模型放在 controller 或 common 目录下,立刻移入 model 目录——ThinkPHP5.1 的自动加载机制只认 model 目录下的类,放错位置会导致模型无法实例化。
第二步:重写数据库操作方法,剥离SQL硬编码
方法一:用模型内置方法替代原始Db类调用
将类似 Db::name('user')->where('status', 1)->select() 的写法,全部改为 (new User())->where('status', 1)->select();注意不要 new 完就链式调用,必须先实例化再调用方法,否则静态上下文丢失。
方法二:对复杂查询启用视图模型或关联预载
涉及多表 JOIN 的旧SQL,禁止手写 raw SQL 字符串拼接;改用模型关联定义(hasOne、hasMany、belongsToMany)+ with(['profile', 'orders']) 预载;若关联字段非标准命名(如 user_id 不叫 user_id 而叫 uid),需在关联方法中显式指定 foreignKey 和 localKey 参数。
方法三:分页逻辑统一收口到模型层
原项目若在控制器里写 Db::table('user')->paginate(15),必须删掉;改为 User::paginate(15),并在模型类中设置 protected $autoWriteTimestamp = true 和 protected $dateFormat = 'Y-m-d H:i:s',确保时间字段自动格式化。
第三步:配置适配新数据库驱动(以KES为例)
① 修改 config/database.php 中 type 值为 'pgsql' 或 'kes'(若已封装KES驱动);
② hostname 改为国产化环境实际IP,如 '192.168.10.23',不可保留 'localhost';
③ 将 username/password 替换为KES分配的专用账号,该账号必须拥有目标schema的 USAGE 和 SELECT/INSERT/UPDATE 权限;
④ 在 param 数组中添加 'schema' => 'public'(KES默认schema);若使用自定义schema(如 app_data),此处必须显式声明;【不声明schema会导致查询返回空结果且无报错】;
⑤ 删除所有出现 'mysql_' 开头的函数调用,如 mysql_real_escape_string、mysql_insert_id —— TP5.1 的模型层已屏蔽底层驱动细节,这些函数在KES环境下根本不存在。


















