2017-10-07 187 views
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":"[email protected]","exception":"[object] (InvalidArgumentException(code: 0): Database [db_2] not configured. at /Users/Sites/cheers/vendor/laravel/framework/src/Illuminate/Database/DatabaseManager.php:140) 

database.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, 
     ], 
] 

ENV:

COMPANY_DB_HOST=127.0.0.1 
COMPANY_DB_PORT=3306 
COMPANY_DB_USERNAME=root 
COMPANY_DB_PASSWORD= 
+0

日志文件的含义告诉你什么? – Webdesigner

+0

@Webdesigner我添加了我在日志中看到的最高错误(不是整个堆栈跟踪) – Packy

+0

而这个错误是你命令的直接结果?你有什么Larael版本? – Webdesigner

回答

0

这很有趣。我需要说我无法完全重现您的错误(我没有在日志中出现任何错误),但是确保迁移仅在第一次循环迭代时运行。

的第一件事情,而不是:

Artisan::call 

我会建议你使用:

$this->call 

你会得到额外的输出究竟怎么回事。

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

所以,你应该加上:

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

在循环的末尾,使其可以运行这样的迁移。

我测试过它,它对我没有任何问题。

+0

完美。我有一种感觉,我必须清除连接。好工作。 – Packy

0

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

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

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