用于多个连接的SQLite内存数据库

时间:2018-02-05 20:06:15

标签: php laravel sqlite phpunit

我的应用程序必须使用两个数据库连接,称为mysqlmysql_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>

0 个答案:

没有答案