Я заметил, что приведенный выше ответ может быть немного опасным: вы можете перезаписывать ключ 'env', не переключая среды.Внезапно ваше приложение сообщает, что вы тестируете, в то время как ваше соединение с БД все еще настроено на работу.
Обычно вы просто хотите действительно придерживаться наилучшей практики Laravel по определению ОДНОЙ среды для каждой литеральной среды, но для моегосценарий использования, необходимый для временного и программного переключения между несколькими средами в рамках одного сценария кустарного промысла.
Мое решение (работает в Laravel 5.8+ с DotEnv3) состоит в том, чтобы действительно перезагрузить приложение:
<?php
$basepath = app()->basePath();
$env = app()->basePath('.env.alternative');
$boot = app()->basePath('bootstrap/app.php');
// Overwrite webserver env
(new Dotenv($basepath,'.env.alternative'))->overload();
// Reboot the application
(require $boot)
->loadEnvironmentFrom($env)
->make(Kernel::class)
->bootstrap();
// This returns 'mysql_alternative', as defined in .env.alternative
dd(DB::connection()->getName())
Отказ от ответственности: я проверял это только в рамках своего собственного кода.