thinkphp 8 数据库配置机制彻底重构:.env为唯一运行时配置源,database.php仅作结构定义;多库需显式命名并用db::connect()调用;mysql连接必须用127.0.0.1且参数严格校验;内置迁移已移除,须改用think-phinx,强制database/migrations路径、database\migrations命名空间及change()方法。

ThinkPHP 8 的数据库配置机制相比早期版本有实质性重构,不是“小修小补”,而是规则重置。核心变化在于配置来源、加载逻辑、多库支持和迁移工具四个维度,稍不注意就会踩坑。
.env 成为唯一运行时配置源
TP8 启用 dotenv 后,.env 文件完全接管 connections 配置块,config/database.php 不再参与运行时决策,仅作结构定义和兜底。哪怕只在 .env 中写了一个 DB_NAME,整个 mysql 连接配置都会被覆盖——框架不做字段合并,而是整块替换。
- database.php 中所有连接字段必须用
env('DB_HOST', '127.0.0.1')形式,不能留死值(如'hostname' => '127.0.0.1') - .env 文件名必须是纯
.env,不能是.env.example或带 BOM 的 UTF-8 - 变量名严格大写+下划线:
DB_PASS有效,db_pass或DB_PASSWORD全部无效 - 密码含
@、/、:等字符时,必须 URL 编码(如pa@ss/word→pa%40ss%2Fword),否则 DSN 解析失败
多数据库必须显式定义连接名
想连两个 MySQL 库,不能靠改 .env 动态切换——.env 是全局生效的扁平配置,不支持条件加载或多组连接。必须在 config/database.php 的 connections 数组里手动定义多个连接名(如 mysql2),并在代码中显式调用 Db::connect('mysql2')。
- .env 中需补充第二组变量:如
DB2_HOST=127.0.0.1、DB2_NAME=test2 - database.php 中对应连接项每个字段都得用
env('DB2_XXX'),不能混用 env() 和静态值 - 切换连接不能写
Db::name('user')->connect('mysql2'),必须先获取实例:$db2 = Db::connect('mysql2'); $db2->name('user')->select(); - 连接名大小写、下划线全敏感,
Db::connect('MySQL2')会 fallback 到默认连接且不报错
MySQL 连接参数更严格,localhost 不再安全
TP8 默认要求 TCP 显式连接,hostname 必须写 127.0.0.1,不能写 localhost。Windows 下后者可能走命名管道或 IPv6,触发 SQLSTATE[HY000] [2054] 认证错误或超时。
-
type和database字段必须显式存在且合法:type只认小写mysql/pgsql等;database对应的库必须已创建且权限正确 - MySQL 8.0+ 空密码用户需改认证插件:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '';,否则 Access denied - 端口不写默认 3306,但若显式设
DB_PORT=3307,则 .env 和 MySQL 实际监听端口必须一致
内置迁移功能彻底移除,改用 think-phinx
TP8 已删除所有 php think migrate: 命令,不再兼容 topthink/think-migration。必须手动集成 think-phinx,且路径、命名空间、方法签名全部收紧。
- 执行
composer require topthink/think-phinx,再运行php think phinx:init生成phinx.php - 迁移文件必须放在
database/migrations/目录,命名空间强制为Database\Migrations - 只支持
change()方法,up()/down()会被静默忽略 - 迁移中禁用
$this->table()->insert(),改用Db::name('users')->insert($data)
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











