TP8中type、hostname、database、username、password、hostport、prefix、params、debug、deploy等database.php配置项彻底失效,已移至connections下的DSN字符串或schema/options等新结构中。

TP5 升级到 TP8 时,database.php 中的配置参数不能直接沿用,多数已被移除或重构 —— 这不是遗漏,是框架主动剥离了对底层驱动的硬编码耦合。
哪些 database.php 配置项在 TP8 中彻底失效
TP8 彻底放弃 type、hostname、database、username、password、hostport、prefix、params 等传统键名。这些字段在 TP5 中属于“连接描述符”,但在 TP8 中被统一收归至 connections 下的 DSN 字符串或独立连接配置块中。
-
type已由 DSN 协议头隐式决定(如mysql://、pgsql://) -
params(PDO 选项数组)不再支持扁平写法,必须通过options键显式嵌套 -
prefix移入模型层或connection级配置,全局前缀需改用schema.prefix -
debug和deploy等运行时开关已上提至应用配置或环境变量控制
TP8 正确的数据库连接配置位置和写法
TP8 使用 config/database.php 返回一个包含 default 和 connections 的数组,每个 connection 是一个完整连接定义,不再依赖全局参数拼接。
示例迁移写法:
return [
'default' => 'mysql',
'connections' => [
'mysql' => [
'type' => 'mysql',
'dsn' => 'mysql:host=127.0.0.1;dbname=thinkphp;charset=utf8mb4',
'username' => 'root',
'password' => '123456',
'hostport' => '3306',
'options' => [
\PDO::ATTR_CASE => \PDO::CASE_NATURAL,
\PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION,
\PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC,
],
'schema' => [
'prefix' => 'tp_',
'name' => 'thinkphp',
],
],
],
];
注意:dsn 必须完整,hostport 仅在 DSN 不含端口时才生效;schema.prefix 才是表前缀的正确落点。
容易踩的三个坑
升级后连不上、报错 Invalid argument supplied for foreach() 或 Call to undefined method think\db\Connection::getConfig(),大概率是以下问题:
- 仍保留 TP5 风格的扁平配置(如把
prefix写在根级别),TP8 会静默忽略,导致建表/查询无前缀或找不到表 - 误将
params当作顶层键,实际应为options,且必须是 PDO 常量数组,传字符串或数字会触发致命错误 - 使用了
think\db\Query的旧静态方法(如Query::connect()),TP8 中连接管理完全交由Connection实例和容器注入,手动 new Query 并不自动绑定连接
最常被忽略的是:TP8 的 schema.name 不再等价于 database 参数,它只影响 Schema 构建器行为(如 migrate),不参与运行时连接初始化 —— 连接库名必须严格写进 dsn。











