当前位置: 首页 > 知识库问答 >
问题:

Laravel多个数据库PHPUnit[重复]

段宏毅
2023-03-14

我正在开发一个具有多个数据库访问的应用程序,我想用它进行PHPUnit测试。我目前的方法是在config\databases.php中拥有多个连接(mysql,mysql2,mysql3),这样我就可以在env文件中对所有这些连接进行不同的访问。因此,模型定义$连接变量。在我的第一个功能测试中,我想访问一个页面,只看到我在工厂提供的数据,所以只是为了让事情开始。在我的phpunit.xml文件中,我已经将DB_CONNECTION指定为sqlite,并且对于每个MySql设置都具有value=": background:"

稍后编辑

<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_CONNECTION" value="sqlite"/>
    <env name="DB_DATABASE_1" value=":memory:"/>
    <env name="DB_DATABASE_2" value=":memory:"/>
    <env name="DB_DATABASE_3" value=":memory:"/>
</php>

所以上面你可以从PHPUnit找到相关的代码。

. env

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=db1
DB_USERNAME=xxx
DB_PASSWORD=xxx

DB_HOST_2=127.0.0.1
DB_PORT_2=3306
DB_DATABASE_2=db2
DB_USERNAME_2=xxx
DB_PASSWORD_2=xxx

DB_HOST_2=127.0.0.1
DB_PORT_2=3306
DB_DATABASE_3=db3
DB_USERNAME_3=xxx
DB_PASSWORD_3=xxx

我遇到的问题是,当我运行测试时,我出现了这个错误-

因此,不知何故,Laravel没有解析内存值。任何建议都将不胜感激。非常感谢。

共有3个答案

罗光华
2023-03-14

为了解决类似的问题,我在Model类上使用了一个trait。

在phpunit.xml中,我有以下代码

<env name="DB_CONNECTION" value="sqlite_testing"/>
<env name="DB_DATABASE" value=":memory:"/>```

在我的config/database.phphtml" target="_blank">文件中,我为每个数据库设置了连接,并为测试设置了一个sqlite_测试连接

'sqlite_testing' => [
    'driver' => 'sqlite',
    'database' => ':memory:',
    'prefix' => '',
],

'mysql_connection_a' => [
        'driver' => 'mysql',
        'host' => env('DB_HOST', '127.0.0.1'),
        'port' => env('DB_PORT', '3306'),
        'database' => env('DB_DATABASE', 'forge'),
        'username' => env('DB_USERNAME', 'forge'),
        'password' => env('DB_PASSWORD', ''),
        'unix_socket' => env('DB_SOCKET', ''),
        'charset' => 'utf8mb4',
        'collation' => 'utf8mb4_unicode_ci',
        'prefix' => '',
        'strict' => true,
        'engine' => null,
    ],

'mysql_connection_b' => [
        'driver' => 'mysql',
        'host' => env('DB_HOST', '127.0.0.1'),
        'port' => env('DB_PORT', '3306'),
        'database' => env('DB_DATABASE_B', 'forge'),
        'username' => env('DB_USERNAME', 'forge'),
        'password' => env('DB_PASSWORD', ''),
        'unix_socket' => env('DB_SOCKET', ''),
        'charset' => 'utf8mb4',
        'collation' => 'utf8mb4_unicode_ci',
        'prefix' => '',
        'strict' => true,
        'engine' => null,
    ],

'mysql_connection_c' => [
        'driver' => 'mysql',
        'host' => env('DB_HOST', '127.0.0.1'),
        'port' => env('DB_PORT', '3306'),
        'database' => env('DB_DATABASE_C', 'forge'),
        'username' => env('DB_USERNAME', 'forge'),
        'password' => env('DB_PASSWORD', ''),
        'unix_socket' => env('DB_SOCKET', ''),
        'charset' => 'utf8mb4',
        'collation' => 'utf8mb4_unicode_ci',
        'prefix' => '',
        'strict' => true,
        'engine' => null,
    ],

然后,我为我的每个连接创建一个特征来设置连接,并将它们包含在相关模型中。e、 g.如果用户模型需要使用mysql\u connection\u a,我会在模型中使用ConnectionTrait

use App\Traits\ConnectionATrait;

class User extends Authenticatable
{
     use Notifiable, ConnectionATrait;

特征就会像这样

trait ConnectionATrait
{
    /**
    * The database table used by the model.
    *
    * @var string
    */

    public function __construct(array $attributes = [])
   {
        parent::__construct($attributes);
        if (env('APP_ENV') != 'testing') {
            $this->connection = 'mysql_connection_a';
        }else{
            $this->connection = 'sqlite_testing';
        }
    }
}

如果您在测试中使用迁移,我还必须在迁移文件中使用类似的方法,并为每个连接使用一个特征。

对于mysql_connection_a我创建了一个特性,如下所示,它覆盖getConnection方法:

trait ConnectionAConnectionTrait
{
    /**
    * Get the migration connection name.
    *
    * @return string
    */
    public function getConnection()
    {
        if (env('APP_ENV') != 'testing') {
            return 'mysql_connection_a';
        }
        return 'sqlite_testing';
    }
}

然后在迁移过程中,它看起来是这样的

use Database\migrations\traits\ConnectionAConnectionTrait;

class CreateUsersTable extends Migration {

     use ConnectionAConnectionTrait;

     /**
     * Run the migrations.
     *
     * @return void
     */
     public function up()
     {
         Schema::connection($this->getConnection())
            ->create('users', function(Blueprint $table)
            {
元鸿波
2023-03-14

难以解码实际放置:内存:值的位置。

在phpunit.xml

<php>
    <env name="DB_CONNECTION" value="sqlite"/>
    <env name="DB_DATABASE" value=":memory:"/>
</php>

国景铄
2023-03-14

我也有同样的问题,但是在亚当·瓦坦的帮助下,我在推特上找到了工作。

以下是我所做的:

phpunit.xml

<env name="DB_CONNECTION" value="sqlite"/>
<env name="DB_DATABASE" value=":memory:"/>
<env name="DB_CONNECTION_ACTIVITY_LOG" value="sqlite"/>
<env name="DB_DATABASE_ACTIVITY_LOG" value=":memory:"/>

config/database.php

'sqlite' => [
    'driver' => 'sqlite',
    'database' => env('DB_DATABASE', database_path('database.sqlite')),
    'prefix' => '',
],

'mysql' => [
    'driver' => env('DB_CONNECTION', 'mysql'),
    'host' => env('DB_HOST', '127.0.0.1'),
    'port' => env('DB_PORT', '3306'),
    'database' => env('DB_DATABASE', 'forge'),
    'username' => env('DB_USERNAME', 'forge'),
    'password' => env('DB_PASSWORD', ''),
    'unix_socket' => env('DB_SOCKET', ''),
    'charset' => 'utf8mb4',
    'collation' => 'utf8mb4_unicode_ci',
    'prefix' => '',
    'strict' => true,
    'engine' => null,
],

'mysql-activity-log' => [
    'driver' => env('DB_CONNECTION_ACTIVITY_LOG', 'mysql'),
    'host' => env('DB_HOST_ACTIVITY_LOG', '127.0.0.1'),
    'port' => env('DB_PORT_ACTIVITY_LOG', '3306'),
    'database' => env('DB_DATABASE_ACTIVITY_LOG', 'forge'),
    'username' => env('DB_USERNAME_ACTIVITY_LOG', 'forge'),
    'password' => env('DB_PASSWORD_ACTIVITY_LOG', ''),
    'unix_socket' => env('DB_SOCKET_ACTIVITY_LOG', ''),
    'charset' => 'utf8mb4',
    'collation' => 'utf8mb4_unicode_ci',
    'prefix' => '',
    'strict' => true,
    'engine' => null,
],

.env

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=my-app
DB_USERNAME=root
DB_PASSWORD=

DB_CONNECTION_ACTIVITY_LOG=mysql-activity-log
DB_HOST_ACTIVITY_LOG=127.0.0.1
DB_PORT_ACTIVITY_LOG=3306
DB_DATABASE_ACTIVITY_LOG=my-app
DB_USERNAME_ACTIVITY_LOG=root
DB_PASSWORD_ACTIVITY_LOG=

此外,对于未达到PDO异常点的任何人,也请确保在迁移/模型中设置连接。

数据库/迁移/my_migration.php:

Schema::connection(env('DB_CONNECTION_ACTIVITY_LOG', 'mysql'))->create(...);

app/MyModel.php

class MyModel extends Model
{
    public function __construct($attributes = [])
    {
        parent::__construct($attributes);
        $this->connection = config('app.env') === 'testing' ? 'sqlite' : 'mysql-activity-log';
    }
    ...
}
 类似资料:
  • 我正在尝试使用多个数据库使用laravel: Laravel版本:5.5.28 Php 7.2.0版 数据库驱动程序 定义连接: 定义模型: 定义控制器: 上面的代码工作正常,但如果我更改控制器中连接的名称,它将继续使用.env文件中配置的名称 请问,有人能帮我解决这个问题吗?

  • 我正在创建一个Laravel/最新版本的应用程序,它需要创建数百个sql表来服务于此项工作。还有数百个客户机的数据将被多次插入这些表中(每个客户机1000行或某些表中更多)。为了消除混淆,我需要一个通用/通用数据库来提供公共信息,并为每个客户机提供单独的数据库来提供特定信息,并且希望在添加客户机时创建新的数据库。这可以在Laravel(一次处理多个数据库)中实现,还是有其他PHP框架可以更好地实现

  • 我不确定这是否可能,但我在安装Laravel时遇到了这种情况。 我正在运行3个实时数据库(随着时间的推移会更多),我有一个laravel安装,我想做的是使用不同的连接合并所有数据,并运行1个查询,以获得所有关系等所有数据使用雄辩。所有的数据库在表设计、索引、键等方面都是一样的,但我不确定是否可能! 我希望能够编写一个查询,例如:

  • 所以我有数百个数据库,我想根据我传递的值来改变使用什么数据库 例如,我有许多公司分支机构有branch_code(000,001,002,003等。高达200)。它们都有相同的表,但只是在不同的数据库中创建的。还假设只有DB Name不同。我的问题是,当有数百个数据库时,我如何访问不同的数据库?我应该动态更改. env文件吗?当用户选择另一个分支时,我应该创建一个改变连接的函数吗?如果是的话,怎么

  • 我找不到连接多个db和链sql查询的方法, 如何使用原始mysql语法? 如何使用拉威尔方法?

  • 我正在构建一个需要连接2个数据库的应用程序。第一个是静态的,另一个是动态的。config/database.php类似于 模型代码就像 如果我提供静态连接详细信息,我可以连接多个数据库,但如果我提供动态连接详细信息,如 或 动态连接多个数据库而不影响应用程序性能的最佳方法是什么?