我发现使用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类)中,并按上面显示的方式调用它们。
答案 0 :(得分:2)
您可以使用所需的所有选项创建包装器命令,然后分别调用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',
]);
编辑
使用$this
代替Artisan
,以及可选地对命令进行排队:
// or $this->queue
$this->call('db:seed', [
'--database' => $this->option('database'),
'--class' => $this->option('class'),
]);