Как я могу позвонить в Artisan :: call (...) более одного раза? (Миграция, а затем Семя) - PullRequest
0 голосов
/ 28 июня 2018

Я обнаружил, что использование команды Artisan::call() для миграции, а затем снова для заполнения приводит к правильной миграции, но база данных никогда не заполняется. Это может быть ошибка или, возможно, есть способ очистить предыдущую команду.

Например:

Artisan::call('migrate', [
    '--database'  => 'tenant',
    '--path'      => 'database/tenantMigrations',
    '--force'     => true,
]);

А потом:

Artisan::call('db:seed', [
    '--database'  => 'tenant',
    '--class' => 'TenantSeeder',
]);

Как видите, я запускаю эти команды на только что созданной клиентской БД, чтобы "подготовить" ее. Каждая из этих команд работает отдельно, но не вместе.

Я попытался найти дополнительную документацию по объединению этих двух команд, но не смог указать класс сеялки. Это может выглядеть примерно так:

Artisan::call('migrate', [
    '--database'  => 'tenant',
    '--path'      => 'database/tenantMigrations',
    '--force'     => true,
    '--seed'      => true,
    '--class'     => 'TenantSeeder', // this is the only one I can't do, which is critical
]);

Я также попытался запустить сеялку, как:

(new \TenantSeeder)->run();

Я получаю ошибку: Call to a member function line() on null.

Интересно также отметить, что все работает правильно в моей локальной среде Homestead, но не на сервере Digital Ocean, управляемом Forge.

Редактировать

Мое текущее решение состоит в том, чтобы поместить мою логику сеялки в обычные классы (которые не расширяют базовый класс сеялок) и вызывать их, как я показал выше.

1 Ответ

0 голосов
/ 28 июня 2018

Вы можете создать команду-оболочку со всеми необходимыми параметрами, а затем вызывать команды migrate, seed и т. Д. По отдельности:

php artisan make:command MigrateAndSeedCommand

Класс может выглядеть примерно так:

class MigrateAndSeedCommand extends Command
{
    protected $signature = 'migrateandseed {--database=} {--path=} {--force} {--seed} {--class=}';

    public function handle()
    {
        Artisan::call('migrate', [
            '--database'  => $this->option('database'),
            '--path'      => $this->option('path'),
            '--force'     => $this->option('force'),
        ]);
        Artisan::call('db:seed', [
            '--database'  => $this->option('database'),
            '--class'     => $this->option('class'),
        ]);
    }
}

Используется через:

php artisan migrateandseed --database=tenants --path=database/tenantMigrations --force --seed --class=TenantSeeder

// or 

Artisan::call('migrateandseed', [
    '--database'  => 'tenant',
    '--path'      => 'database/tenantMigrations',
    '--force'     => true,
    '--seed'      => true,
    '--class'     => 'TenantSeeder',
]);

EDIT

Используйте $this вместо Artisan, а также опционально ставьте команды в очередь:

// or  $this->queue
$this->call('db:seed', [
    '--database'  => $this->option('database'),
    '--class'     => $this->option('class'),
]);

Вызов команд из других команд

...