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 может подключиться к этой БД.

Другие вопросы по тегам