我的应用程序必须使用两个数据库连接,称为mysql
和mysql_tenant
。用户模型位于第一个连接上,公司模型位于第二个连接上。
两者之间存在关系,一个公司属于多个用户。该关系使用存储在company_user
数据库中的mysql_tenant
数据透视表。
这种关系定义如下:
public function users()
{
return $this->belongsToMany(User::class, 'demo_tenant.company_user');
}
在这种情况下, demo_tenant 是我的ENV文件中定义的第二个数据库的名称。
这非常有用,除了测试之外。我正在使用PHPUnit并将DB_DRIVER设置为 sqlite ,将DB_DATABASE设置为:memory:,以便测试运行得更快,并且不会访问实际的MySQL数据库。
当我运行测试时,代码在尝试访问demo_tenant
数据库时失败,因为为了测试,名称被:memory:
替换。
我尝试用更动态的东西替换硬编码值:
public function users()
{
return $this->belongsToMany(User::class, env('DB_DATABASE_TENANT') . '.company_user');
}
但是,当测试运行时出现以下错误仍然会失败:
PDOException:SQLSTATE [HY000]:一般错误:1没有这样的表:: memory:.company_user
如何使内存数据库与多个连接一起使用?有没有办法给每个人一个独特的名字?
以下是我的phpunit.xml
供参考:
<php>
<env name="APP_ENV" value="testing"/>
<env name="CACHE_DRIVER" value="array"/>
<env name="SESSION_DRIVER" value="array"/>
<env name="QUEUE_DRIVER" value="sync"/>
<env name="DB_DRIVER" value="sqlite"/>
<env name="DB_DATABASE" value=":memory:"/>
<env name="DB_DRIVER_TENANT" value="sqlite"/>
<env name="DB_DATABASE_TENANT" value=":memory:"/>
</php>