无法将 Laravel 安装到动态创建的数据库

Can't install Laravel to dynamically created database

我正在尝试设置一个执行以下操作的工作流(必须在 CI 中工作,即在它 运行s 之前不存在):

编辑:建议让 Laravel 测试处理所有这些,因为它会擦除然后迁移您的数据库,但如果我理解正确,这假设数据库已经存在,即。我必须手动创建数据库,在 .env 中设置它,然后 运行 我的脚本来安装应用程序和 运行 测试。那不是想要的结局 goal/workflow.

我有一个 Artisan 命令(gist here, cred to 用于一堆代码)似乎应该完成上述所有操作,除了 运行 测试(不能做那么多) ).您可以在要点或下方看到我尝试告诉命令要连接到哪个数据库的多种方式:

// $_ENV['DB_DATABASE'] = $dbname;
// $this->getLaravel()->environment(['DB_DATABASE' => $dbname]);
// $this->info('env: ' . $this->getLaravel()->environment('DB_DATABASE'));
// \Illuminate\Support\Env::enablePutenv();
// putenv('DB_DATABASE=' . $dbname);
// $this->info('env: ' . json_encode($_ENV));
// $this->call('config:clear');
config(['database.connections.' . $connection . '.database' => $dbname]);

我发现每次我 运行 脚本时,无论我如何尝试告诉环境要使用什么数据库,它都会尝试安装我现有的开发环境之上在我的 .env 文件中定义。我希望 php artisan install --ready 安装到新的随机命名的数据库中,以便随后 运行 使用该数据库进行测试。

不过我发现没有办法动态地告诉 Laravel 或 PHPUnit 使用哪个数据库,所以这似乎是毫无意义的努力。但这是一个很常见的用例。 Laravel 开发者通常如何处理这个问题?设置数据库然后 copies/edits .env 和 phpunit.xml 文件的节点脚本?在 CI 环境中完成这一切?我觉得我错过了什么。

编辑:我已经更新了要点以包括来自 的推荐更改,它使事情按预期工作,运行ning DB:reconnect($connection) 在更改 config() 之后.

如果您想在 运行 时间内更改配置,请使用:

config(["database.connections.{$connection}.database" => $dbname]);

但是,当您更改预先存在的连接时,DatabaseManager 可能已经使用旧配置创建了连接。因此,您可能需要 运行 以下内容:

DB::reconnect($connection);

如果是未使用的全新连接,则不需要。即

config(["database.connections.{$connection}' => $connectionConfig]);

如果您想选择要使用的数据库连接,只需执行以下操作:

DB::connection($connectionName)->where('what_ever', 20)->...->get()

或者像这样更改默认连接:

DB::setDefaultConnection($connectionName);
DB::where('whaterver', 20)->...->get()

以下不起作用的原因是:

// You shouldn't be changing env variables during runtime, especially if config is cached
$_ENV['DB_DATABASE'] = $dbname; 

// this function checks what environment your in. Correct usage $this->getLaravel()->environment('staging')
$this->getLaravel()->environment(['DB_DATABASE' => $dbname]); 
$this->info('env: ' . $this->getLaravel()->environment('DB_DATABASE'));

// This enables the the putenv adapter. You shouldn't be calling it for this.
\Illuminate\Support\Env::enablePutenv();

// putenv shouldn't be used in Laravel project
putenv('DB_DATABASE=' . $dbname);

// This should set the database for the config, but you need to make sure your using it. Note this change is not persistent.
config(['database.connections.' . $connection . '.database' => $dbname]);