Так что это мой процесс. Я запускаю команду, и она создает новое соединение. Затем он устанавливает это соединение по умолчанию. ЭТО работает отлично.
Это также отменяет другое соединение. Однако, поскольку у нас может быть только одно значение по умолчанию вместо создания нового соединения и установки его по умолчанию, оно просто копирует старое соединение / заменяет информацию базы данных, а затем переопределяет это соединение.
Затем я немедленно создаю модель, которая использует это соединение. Я даже вхожу в это и выбрасываю $this->getConnection()
и вижу, что его вытащили в мои новые настройки и конфиги. Моя проблема в том, что когда я делаю -> all (), я получаю информацию от ПРЕДЫДУЩЕГО переопределенного соединения. Понятия не имею почему.
Вот пример моего кода:
public function handle()
{
if (!is_null($this->env = $this->option('env'))) {
(new Dotenv(base_path(), ".env.{$this->env}"))->overload();
}
$this->setClientConnection();
dd(\Override::getModel('User')->changeConnection('webApp')->get()->pluck('login_name', 'users_id'));
}
/**
* Create the database and a temporary connection
*
* @return null
*/
protected function setClientConnection()
{
$clientDb = env('DB_DATABASE');
$userDb = env('DB_APP_DATABASE');
// Create temporary connection
$newConnection = config('database.connections.data');
$newConnection['database'] = $clientDb;
config(['database.connections.' . $clientDb => $newConnection]);
// Set new connection as default
config(['database.default' => $clientDb]);
// Override Webapp database
$newUserConnection = config('database.connections.webApp');
$newUserConnection['database'] = $userDb;
config(['database.connections.webApp' => $newUserConnection]);
}
Просто повторюсь, создание нового соединения и установка его по умолчанию работает отлично. Создание нового соединения и использование его для переопределения существующего соединения SEEMS для работы. config('database.connections.webApp')
дает новую информацию о соединении. (new App\User)->getConnection()
возвращает правильную конфигурацию и база данных устанавливается на новую базу данных. глядя на модельный объект, все кажется правильным. Тогда я иду, чтобы сделать ->all()
вызов и он вытягивает переопределенное соединение и тянет из старой базы данных.
Постскриптум метод changeConnection, который я добавил, чтобы проверить некоторые вещи и посмотреть на другие защищенные атрибуты. Большую часть своего дампинга я делал оттуда, и это выглядит так, будто оно должно использовать новое соединение … до тех пор, пока оно на самом деле не сделает вызов … тогда нет.
Когда вы запускаете get () на Eloquent Model, он запускает запрос на Illuminate\Query\Builder
объект (после прохождения через функцию-оболочку Illuminate \ Eloquent \ Query \ Builder).
Illuminate\Query\Builder
объект хранит ссылку на объект соединения, используемый для запроса.
Поскольку сначала создается ваша модель, а затем изменяется соединение, объект Query Builder по-прежнему использует старое соединение
Чтобы решить эту проблему, вам нужно создать новый экземпляр построителя запросов модели с новым соединением
Есть несколько способов сделать это:
on
вот так: User::on('connection_name')->find($userId)
newFromBuilder
метод вот так: $model->newFromBuilder($model->getAttributes, 'connection_name')
newQuery
метод чтобы получить свежий Eloquent конструктор, вот так: $model->setConnection('connection_name')->newQuery()->find($userId)
fresh
метод вот так: $model->setConnection('connection_name')->fresh()
, Обратите внимание, что метод fresh запускает новый запрос, в то время как другие параметры устанавливают соединение без запуска нового запроса.
Ваш выбор функции будет основан на
Других решений пока нет …