在我的本地环境中,我正在与多个租户和Redis(需要身份验证)合作。 为了服务该项目,我正在使用Valet。
对于这种情况,我要解决以下两个连接:
- basic_foo (is defined in my .env) - tenant_foo (is the one to change to during a request)
到目前为止,我成功更改了连接,如下所示:
config()->set('database.connections.mysql', array_merge( config()->get('database.connections.mysql') , ['database' => 'tenant_foo'] );
但是,现在我看到查询生成器出现问题,保持或退回到基本连接。
运行时,我得到了 tenant_foo 的预期连接结果(与Redis相同)
dd(config()->get('database.connections.mysql'));
我得到的错误,但显然积极结果 basic_foo 当我运行
dd(\DB::connection()); // returns Illuminate\Database\MySqlConnection
因此所有应用程序都将返回此Illuminate \ Database \ QueryException
SQLSTATE[42S02]: Base table or view not found: 1146 Table 'basic_foo.table_bar' doesn't exist...
它应该在哪里搜索
'tenant_foo.table_bar'
像下面这样简单地将数据库名称更改为 tenant_foo 是不够的,因为config数组仍然与 basic_foo 相同。
\DB::connection()->setDatabaseName('tenant_foo');
要动态更改数据库名称,应使用:
DB::disconnect(); Config::set('database.mysql.database', 'tenant_foo'); DB::reconnect();