Hyperf 中 Model 可通过 $connection 属性绑定不同数据库连接,需在 databases.php 配置多连接、Model 中声明对应连接名,并确保容器已注册;支持主从、分库及业务隔离场景,但跨连接不共享事务。

Hyperf 中的 Model 可以通过 connection 属性绑定不同的数据库连接,实现一个项目中多个数据库(如 MySQL 主从、分库、业务隔离库)的灵活操作。关键在于正确配置连接、声明 Model 的连接名,并确保连接在容器中已注册。
1. 配置多个数据库连接
在 config/autoload/databases.php 中定义多个连接,例如:
'default' => [
'driver' => env('DB_DRIVER', 'mysql'),
'host' => env('DB_HOST', 'localhost'),
'port' => env('DB_PORT', 3306),
'database' => env('DB_DATABASE', 'hyperf'),
'username' => env('DB_USERNAME', 'root'),
'password' => env('DB_PASSWORD', ''),
// ... 其他配置
],
'slave' => [
'driver' => env('DB_SLAVE_DRIVER', 'mysql'),
'host' => env('DB_SLAVE_HOST', '192.168.1.100'),
'port' => env('DB_SLAVE_PORT', 3306),
'database' => env('DB_SLAVE_DATABASE', 'hyperf_slave'),
'username' => env('DB_SLAVE_USERNAME', 'reader'),
'password' => env('DB_SLAVE_PASSWORD', ''),
// ... 其他配置
],
'log_db' => [
'driver' => env('DB_LOG_DRIVER', 'mysql'),
'host' => env('DB_LOG_HOST', '192.168.1.200'),
'port' => env('DB_LOG_PORT', 3306),
'database' => env('DB_LOG_DATABASE', 'hyperf_log'),
'username' => env('DB_LOG_USERNAME', 'logger'),
'password' => env('DB_LOG_PASSWORD', ''),
]
Hyperf 会自动为每个连接名(如 slave、log_db)创建对应的 PDO 实例和 Connection 对象。
2. 创建独立 Model 并指定 connection
在 app/Model/ 下新建 Model 类,显式设置 $connection 属性:
namespace App\Model;
use Hyperf\DbConnection\Model\Model;
class UserLog extends Model
{
protected $table = 'user_logs';
protected $connection = 'log_db'; // ✅ 绑定到 log_db 连接
}
class SlaveUser extends Model
{
protected $table = 'users';
protected $connection = 'slave'; // ✅ 绑定到 slave 连接
}
注意:$connection 值必须与 databases.php 中定义的连接键名完全一致。
3. 使用 Model 执行操作
直接调用即可,无需手动切换连接:
-
UserLog::insert(['user_id' => 1, 'action' => 'login']);→ 写入log_db -
SlaveUser::where('id', 1)->first();→ 从slave读取 -
SlaveUser::on('default')->find(1);→ 临时覆盖连接(慎用,仅限单次)
事务需注意:跨连接无法共用同一事务,每个 Model 的操作只作用于其绑定的连接。
4. 验证连接是否生效
可在控制器或命令中快速验证:
// 查看当前 Model 使用的连接名和 PDO 实例
var_dump(UserLog::getConnection()->getName()); // 输出: 'log_db'
var_dump(UserLog::getConnection()->getPdo() instanceof PDO); // true
// 查看实际执行的 SQL 日志(开启 query log 后)
UserLog::query()->enableQueryLog();
UserLog::select('id')->take(1)->get();
var_dump(UserLog::getQueryLog());
确保日志中显示的 host/port 与 log_db 配置一致,即说明绑定成功。


















