发布于2026-07-11 阅读(0)
扫一扫,手机访问
先说几个核心判断:ThinkPHP 6 的数据库配置,跟 TP5.1 相比,改动幅度相当大,绝不是简单复制粘贴旧版配置文件就能搞定的事。从结构到逻辑,再到扩展支持,底层逻辑都变了样。如果直接迁移,大概率会遇到连库失败、读写分离不生效、迁移命令报错这类问题,甚至环境变量都读不出来。

所以,这篇文章把几个关键差异点拆开来讲,希望能帮大家少走弯路。
TP5.1 时代,一个 database.php 文件搞定一切,所有数据库连接写在一个大数组里返回就行。但到了 TP6,这套玩法就彻底变了——配置必须按功能拆分,而且依赖 .env 文件来做运行时的动态覆盖。
'hostname' => 'localhost' 没问题,TP6 则必须写成 'hostname' => env('DB_HOST', 'localhost'),否则 env() 函数读不到值。.env 文件必须存在,且命名必须准确,不能是 .env.local 这种变体,否则环境变量加载会失败。config/oss.php,它不会自动加载,需要在 config/autoload.php 里显式声明 return ['oss']; 才行。TP5.1 支持 DSN 字符串连接,比如 mysql://root:123@127.0.0.1:3306/db#utf8,用起来很灵活。但 TP6 已经彻底移除了这个能力,所有连接必须通过数组定义,并且要在 config/database.php 中显式声明连接标识。
Db::connect('mysql://...') 这种写法的,在 TP6 里会直接报错。现在必须改成 Db::connect('mysql'),同时确保 database.connections.mysql 下有对应的配置数组。'sys_db'、'log_db',在代码各处显式传入即可。default 键当作默认连接名,实际生效的是 database.default 配置项的值。TP5.1 的读写分离,靠的是 'read_master' => true 这个开关,逻辑相对简单,仅对 select 类查询尝试走从库。但可控性也差,很多场景下不够精细。TP6 则改成了基于 deploy 和 rw_separate 的模型级路由策略,灵活性大幅提升,但配置复杂度也上来了。
where()->find() 和 where()->value() 行为一致,都会走从库(如果开启了读写分离)。但在 TP6 中,后者可能绕过从库,因为底层调用的是 query 方法,而非 select。'sla ve' => [['host' => 's1'], ['host' => 's2']]。如果写成了一维数组,系统会静默失败,但不会报错,排查起来很头疼。TP5.1 自带 think migrate 命令,而且默认支持多连接(虽然有一些缺陷)。到了 TP6,迁移能力被完全剥离,需要手动安装扩展、注册命令、初始化元数据表,三步缺一不可。
composer require topthink/think-migration:^4.0(TP6.3+ 版本推荐这个版本)。config/console.php 的 'commands' 数组中,加入 thinkmigrationCommand::class,这样命令才能被系统识别。php think migrate:install 创建 think_migration 表,否则后续的 run 命令会直接失败。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8