首页 > 解决方案 > 如何多次调用 Artisan::call(...) ?(迁移然后播种)

问题描述

我发现使用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 服务器上正常运行。

编辑

我当前的解决方案是将我的播种器逻辑放在常规类(不扩展基本播种器类)中,并如上所示调用它们。

标签: laravellaravel-artisanlaravel-seeding

解决方案


您可以使用所需的所有选项创建一个包装器命令,然后单独调用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'),
]);

从其他命令调用命令


推荐阅读