Laravel — переопределить соединение, но модель все еще возвращает данные из предыдущего соединения

Так что это мой процесс. Я запускаю команду, и она создает новое соединение. Затем он устанавливает это соединение по умолчанию. ЭТО работает отлично.

Это также отменяет другое соединение. Однако, поскольку у нас может быть только одно значение по умолчанию вместо создания нового соединения и установки его по умолчанию, оно просто копирует старое соединение / заменяет информацию базы данных, а затем переопределяет это соединение.

Затем я немедленно создаю модель, которая использует это соединение. Я даже вхожу в это и выбрасываю $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, который я добавил, чтобы проверить некоторые вещи и посмотреть на другие защищенные атрибуты. Большую часть своего дампинга я делал оттуда, и это выглядит так, будто оно должно использовать новое соединение … до тех пор, пока оно на самом деле не сделает вызов … тогда нет.

0

Решение

Когда вы запускаете get () на Eloquent Model, он запускает запрос на Illuminate\Query\Builder объект (после прохождения через функцию-оболочку Illuminate \ Eloquent \ Query \ Builder).

Illuminate\Query\Builder объект хранит ссылку на объект соединения, используемый для запроса.

Поскольку сначала создается ваша модель, а затем изменяется соединение, объект Query Builder по-прежнему использует старое соединение

Чтобы решить эту проблему, вам нужно создать новый экземпляр построителя запросов модели с новым соединением

Есть несколько способов сделать это:

  1. Используйте статическую функцию on вот так: User::on('connection_name')->find($userId)
  2. Использовать newFromBuilder метод вот так: $model->newFromBuilder($model->getAttributes, 'connection_name')
  3. Использовать newQuery метод чтобы получить свежий Eloquent конструктор, вот так: $model->setConnection('connection_name')->newQuery()->find($userId)
  4. Использовать fresh метод вот так: $model->setConnection('connection_name')->fresh(),

Обратите внимание, что метод fresh запускает новый запрос, в то время как другие параметры устанавливают соединение без запуска нового запроса.

Ваш выбор функции будет основан на

  1. Если у вас уже есть экземпляр модели или вы хотите использовать статические методы и
  2. Нужен ли вам только объект конструктора (например, №3) или вам нужен экземпляр модели
1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector