hyperf 中模型通过 $connection 属性静态绑定数据库连接,需与 config/autoload/databases.php 中配置的键名完全一致,不支持运行时切换,未配置会抛出 invalidargumentexception。

在 Hyperf 中,模型指定数据库连接是通过设置模型类的 $connection 属性来实现的,而不是像 Laravel 那样用 connection() 方法动态切换。Hyperf 的 Model 类继承自 Hyperf\Database\Model\Model,支持直接绑定到某个已配置的数据库连接。
你需要确保:
- 数据库连接已在
config/autoload/databases.php中正确定义(例如名为mysql2); - 模型中通过
$connection属性声明使用哪个连接名。
✅ 正确写法如下:
<?php declare(strict_types=1);
namespace App\Model;
use Hyperf\DbConnection\Model\Model;
class User extends Model
{
// 指定使用名为 'mysql2' 的数据库连接(需在 databases.php 中配置)
protected $connection = 'mysql2';
protected $table = 'users';
}? 注意事项:
-
$connection的值必须与databases.php中配置的键名完全一致(如'default'、'mysql2'等); - 该设置是静态绑定的,每个模型只能固定使用一个连接(不支持运行时动态切换);
- 如果未设置
$connection,模型默认使用default连接; - 若连接名不存在,查询时会抛出
InvalidArgumentException,提示“Database connection [xxx] not configured”。
? 补充:检查 databases.php 示例配置
// config/autoload/databases.php
return [
'default' => [
'driver' => env('DB_DRIVER', 'mysql'),
'host' => env('DB_HOST', 'localhost'),
'database' => env('DB_DATABASE', 'hyperf'),
// ... 其他配置
],
'mysql2' => [
'driver' => 'mysql',
'host' => '192.168.1.100',
'database' => 'another_db',
'username' => 'root',
'password' => '123456',
// ... 必填项都要完整
],
];
? 小技巧:多个模型复用同一连接,可定义基类统一设置
abstract class BaseTenantModel extends Model
{
protected $connection = 'mysql2';
}
class Order extends BaseTenantModel { }
class Product extends BaseTenantModel { }
这样就不用每个模型都重复写 $connection。











