我怎样才能多次呼叫Artisan :: call(...)? (先迁移再种子)

时间:2018-06-28 02:16:30

标签: laravel artisan laravel-seeding

我发现使用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环境中正常工作,但不能在Forge管理的Digital Ocean服务器上正常工作。

编辑

我当前的解决方案是将播种机逻辑放入常规类(不扩展基Seeder类)中,并按上面显示的方式调用它们。

1 个答案:

答案 0 :(得分:2)

您可以使用所需的所有选项创建包装器命令,然后分别调用migrateseed等命令:

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',
]);

编辑

使用$this代替Artisan,以及可选地对命令进行排队:

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

Calling Commands From Other Commands