Artisan Call in Loop
У меня есть настраиваемая консольная команда, которая должна пройти через несколько компаний и создать базу данных для каждой из них. Команда работает сейчас, но только один раз. Он не запускает миграцию второй раз в цикле. Так что в основном, если у меня есть 2 пустых БД (db_on
е и 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)
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=
2 ответа
Это было довольно интересно. Я должен сказать, что я не смог полностью воспроизвести вашу ошибку (я не получил никакой ошибки в журнале), но наверняка миграция выполняется только для 1-й итерации цикла.
Первым делом вместо:
Artisan::call
Я бы порекомендовал вам использовать:
$this->call
вы получите дополнительный вывод, что на самом деле происходит.
Но самое главное, чтобы он работал, - это отключиться от базы данных и очистить соединение. В противном случае Laravel не увидит, что вы изменили имя вашей базы данных в конфигурации, и будете использовать старую базу данных.
Поэтому вы должны добавить:
$this->laravel['db']->purge('company');
в конце цикла, чтобы можно было выполнять такие миграции.
Я проверил это, и оно работает для меня без проблем.
Я предполагаю, что у вас есть проблемы с вашей логикой. Вы устанавливаете имя БД для своей конфигурации, но доза этого выхода из БД? А как насчет отдыха? Пользовательский пароль? Они всегда одинаковы?
Петля не проблема, верно! $companies = Company::all();
Получите получить дату из базы данных по умолчанию, и вы можете зациклить.
Я предполагаю, что первая БД в вашем списке уже существует (возможно, по умолчанию), но вторая на нет, и migrate
не создавайте базу данных, она только заполняет ее данными, если laravel может подключиться к этой БД.