在thinkphp 6中,模型需显式声明protected $connection = 'user';才能固定使用指定数据库连接,且键名大小写敏感;动态切换可用connect()方法或db::setconnectconfig()注册临时连接;事务要求所有模型共用同一连接标识,否则无法回滚。

让模型自动接入指定数据库连接
在 ThinkPHP 6 中,模型默认走 default 连接,若需让某个模型固定使用 user 数据库而非 admin,不能只改配置文件,必须在模型类中显式声明连接标识。
打开 app/model/UserModel.php,确保类定义顶部包含 protected $connection = 'user'; 这行代码。
注意:$connection 的值必须与 database.php 中 connections 数组的键名完全一致,大小写敏感,【'user' ≠ 'User' ≠ 'USER'】,写错会导致查询仍走 default 连接且无报错提示。
保存后,在控制器中直接调用 (new UserModel())->select() 即可从 user 数据库读取数据。
运行时动态切换模型所用连接
当同一模型需根据请求参数切换数据库(如租户 ID 不同查不同库),不能靠 $connection 属性——它只在模型初始化时读取一次。
方法一:使用 Db::connect() + name() 链式调用
在控制器中写:Db::connect('admin')->name('administrator_information')->select();
方法二:通过模型实例绑定连接
先 new 模型,再调用 connect() 方法:(new UserModel())->connect('admin')->select();
方法三:使用 setConnectConfig 注册临时连接(适合连接参数来自请求)
例如从 URL 获取 host 和 db_name:Db::setConnectConfig('temp_tenant', ['type'=>'mysql','hostname'=>$host,'database'=>$dbname,'username'=>'root','password'=>'']);
然后调用 (new UserModel())->connect('temp_tenant')->select();
避免多模型切换时事务失效
第一步:确认所有要参与事务的模型都使用同一个连接标识。
第二步:在事务块内统一用 Db::connect('xxx') 开启,不要混用不同 connect() 实例。
第三步:执行事务前,检查各模型是否真的连向同一物理数据库——不同连接标识即使指向同一 MySQL 实例,TP 也会视为独立连接池,【跨连接标识开启的事务无法回滚】。
验证方式:在事务开始前打印 Db::connect('user')->getConfig()['database'] 和 Db::connect('admin')->getConfig()['database'],确保二者返回值相同。
如果必须跨库操作又需强一致性,改用原生 SQL 手动控制,或引入分布式事务中间件。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











