2

我有一个自定义控制台命令,需要遍历一些公司并为每个公司创建一个数据库。该命令现在有效,但只有一次。它不会在循环中第二次运行迁移。所以基本上如果我有 2 个空白数据库(db_one 和db_two),配置运行并迁移第一次db_one,当循环再次运行时,没有任何反应db_two。如果我替换控制台命令以仅回显数据库名称,它会返回两者,所以我知道它不是循环。此外,如果我注销循环的每个连接中使用的数据库,它就是正确的数据库。

这是命令:

public function handle()
{
    $companies = Company::all();

    foreach( $companies as $company)
    {
        \Config::set('database.connections.company.database', $company->db_name);

        Artisan::call( 'migrate', [
            '--database' => 'company',
            '--path' => 'database/migrations/company',
        ]);

        $this->info(  config('database.connections.company.database') );

    }
}

日志错误:

local.ERROR: Database [10_barrel] not configured. {"userId":1,"email":"packy@sites.com","exception":"[object] (InvalidArgumentException(code: 0): Database [db_2] not configured. at /Users/Sites/cheers/vendor/laravel/framework/src/Illuminate/Database/DatabaseManager.php:140)

数据库.php

'connections' => [

        'main' => [
            'driver' => 'mysql',
            'host' => env('MAIN_DB_HOST', '127.0.0.1'),
            'port' => env('MAIN_DB_PORT', '3306'),
            'database' => env('MAIN_DB_DATABASE', 'forge'),
            'username' => env('MAIN_DB_USERNAME', 'forge'),
            'password' => env('MAIN_DB_PASSWORD', ''),
            'unix_socket' => env('MAIN_DB_SOCKET', ''),
            'charset' => 'utf8mb4',
            'collation' => 'utf8mb4_unicode_ci',
            'prefix' => '',
            'strict' => true,
            'engine' => null,
        ],

        'company' => [
            'driver' => 'mysql',
            'host' => env('COMPANY_DB_HOST', '127.0.0.1'),
            'port' => env('COMPANY_DB_PORT', '3306'),
            'database' => '',
            'username' => env('COMPANY_DB_USERNAME'),
            'password' => env('COMPANY_DB_PASSWORD'),
            'unix_socket' => env('COMPANY_DB_SOCKET', ''),
            'charset' => 'utf8mb4',
            'collation' => 'utf8mb4_unicode_ci',
            'prefix' => '',
            'strict' => true,
            'engine' => null,
        ],
]

环境:

COMPANY_DB_HOST=127.0.0.1
COMPANY_DB_PORT=3306
COMPANY_DB_USERNAME=root
COMPANY_DB_PASSWORD=
4

2 回答 2

0

我假设你的逻辑有问题。你为你的配置设置了一个数据库名称,但是这个数据库退出了吗?其余的呢?用户密码?它们总是一样吗?

循环不是问题,对吧!$companies = Company::all();将从默认数据库中获取日期,并且可以循环。

我假设您列表中的第一个数据库已经存在(可能是默认数据库),但第二个不存在,并且migrate不要创建数据库,如果 laravel 可以连接到数据库,它只会用数据填充它。

于 2017-10-07T18:14:39.113 回答
0

这很有趣。我需要说我无法完全重现您的错误(我在日志中没有收到任何错误),但可以肯定迁移仅针对第一次循环迭代运行。

第一件事而不是:

Artisan::call

我建议您使用:

$this->call

你会得到额外的输出真正发生的事情。

但要使其正常工作,最重要的是断开与数据库的连接并清除连接。否则 Laravel 不会看到您在配置中更改了数据库名称,并且会使用旧数据库。

所以你应该添加:

$this->laravel['db']->purge('company');

在循环结束时,可以像这样运行迁移。

我已经对其进行了测试,它对我有用,没有任何问题。

于 2017-10-07T19:23:07.773 回答