Artisan 循环调用
Artisan Call in Loop
我有一个自定义控制台命令,需要遍历一些公司并为每个公司创建一个数据库。该命令现在有效,但只有一次。它不会 运行 循环中的第二次迁移。所以基本上如果我有 2 个空白数据库(db_on
e 和 db_two
)配置 运行s 并第一次迁移 db_one
并且当循环 运行又一次,db_two
没有任何反应。如果我将控制台命令替换为仅回显数据库名称 returns 两者,那么我知道它不是循环。另外,如果我注销循环的每个连接中使用的数据库,那么它就是正确的数据库。
命令如下:
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)
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,
],
]
环境:
COMPANY_DB_HOST=127.0.0.1
COMPANY_DB_PORT=3306
COMPANY_DB_USERNAME=root
COMPANY_DB_PASSWORD=
我假设你的逻辑有问题。您为您的配置设置了一个数据库名称,但退出此数据库?剩下的呢?用户密码?它们总是一样的吗?
循环不是问题,对吧! $companies = Company::all();
会从默认数据库获取日期,你可以循环。
我假设您列表中的第一个数据库已经存在(可能是默认数据库),但第二个不存在,并且 migrate
不要创建数据库,它只会用数据填充它,如果 laravel 可以连接到数据库。
挺有意思的。我需要说我无法完全重现您的错误(我没有在日志中收到任何错误)但可以肯定的是迁移 运行 仅适用于第一次循环迭代。
第一件事而不是:
Artisan::call
我建议您使用:
$this->call
你会得到额外的输出结果。
但要使其正常工作最重要的是断开与数据库的连接并清除连接。否则 Laravel 将看不到您在配置中更改了数据库名称并将使用旧数据库。
所以你应该添加:
$this->laravel['db']->purge('company');
在循环结束时可以 运行 像这样迁移。
我已经测试过了,它对我来说没有任何问题。
我有一个自定义控制台命令,需要遍历一些公司并为每个公司创建一个数据库。该命令现在有效,但只有一次。它不会 运行 循环中的第二次迁移。所以基本上如果我有 2 个空白数据库(db_on
e 和 db_two
)配置 运行s 并第一次迁移 db_one
并且当循环 运行又一次,db_two
没有任何反应。如果我将控制台命令替换为仅回显数据库名称 returns 两者,那么我知道它不是循环。另外,如果我注销循环的每个连接中使用的数据库,那么它就是正确的数据库。
命令如下:
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)
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,
],
]
环境:
COMPANY_DB_HOST=127.0.0.1
COMPANY_DB_PORT=3306
COMPANY_DB_USERNAME=root
COMPANY_DB_PASSWORD=
我假设你的逻辑有问题。您为您的配置设置了一个数据库名称,但退出此数据库?剩下的呢?用户密码?它们总是一样的吗?
循环不是问题,对吧! $companies = Company::all();
会从默认数据库获取日期,你可以循环。
我假设您列表中的第一个数据库已经存在(可能是默认数据库),但第二个不存在,并且 migrate
不要创建数据库,它只会用数据填充它,如果 laravel 可以连接到数据库。
挺有意思的。我需要说我无法完全重现您的错误(我没有在日志中收到任何错误)但可以肯定的是迁移 运行 仅适用于第一次循环迭代。
第一件事而不是:
Artisan::call
我建议您使用:
$this->call
你会得到额外的输出结果。
但要使其正常工作最重要的是断开与数据库的连接并清除连接。否则 Laravel 将看不到您在配置中更改了数据库名称并将使用旧数据库。
所以你应该添加:
$this->laravel['db']->purge('company');
在循环结束时可以 运行 像这样迁移。
我已经测试过了,它对我来说没有任何问题。