Мне нужно изменить соединение базы данных laravel 5 во время выполнения.
Есть ли у вас какие-либо идеи?
Пожалуйста, поделитесь со мной.
Спасибо.
Мне нужно изменить соединение базы данных laravel 5 во время выполнения.
Есть ли у вас какие-либо идеи?
Пожалуйста, поделитесь со мной.
Спасибо.
Обновление: этот ответ с 2015 года! Я не использовал Laravel в течение многих лет, и я не в курсе последних лучших практик. За этот ответ проголосовали, поэтому я думаю, что он работает, но, пожалуйста, действуйте осторожно.
Ну, мой немедленный ответ на это: не надо. Скорее всего, вы можете выполнить свою задачу, изменив модель данных и работая с более сложными отношениями. Трудно сказать, не зная, что вы хотите сделать, но мне кажется, что это плохая идея в целом, особенно если вы планируете использовать красноречивые модели и т.д.
Тем не менее, в некотором сценарии, когда вам действительно нужно изменить данные в другой базе данных или выполнить какой-то необработанный запрос, вы можете использовать метод DB::connection()
. Что-то вроде:
$data = DB::connection('another_connection')->select(...);
Вы можете указать эту переменную another_connection
в вашем файле database.php
. Как это:
<?php
return array(
'default' => 'mysql',
'connections' => array(
# Your regular connection
'mysql' => array(
'driver' => 'mysql',
'host' => 'localhost',
'database' => 'database',
'username' => 'user',
'password' => 'password'
'charset' => 'utf8',
),
# Your new connection
'another_connection' => array(
'driver' => 'mysql',
'host' => 'another_host',
'database' => 'another_db',
'username' => 'user1',
'password' => 'password1'
'charset' => 'utf8',
),
),
);
Вы даже можете указать соединение для каждой красноречивой модели, используя protected $connection = 'another_connection';
также вы можете указать соединение для каждого экземпляра модели, созданного/запрошенного во время выполнения
$user = new User;
$user->setConnection('another_connection');
$user1 = $user->find(1);
Но опять же, я лично не думаю, что это хорошая идея, и мне кажется, что все может запутаться и очень быстро развалиться, поскольку ваше приложение усложняется.
Вы можете изменить данные о соединении во время выполнения, используя
Config::set('database.connections.mysql.database', 'other_database');
но не забудьте очистить до удаления кеша
DB::purge('mysql');
У нас есть аналогичный сценарий, где искать исторические данные, мы меняем базу данных. В модели мы используем следующее:
public function inventory($db, $id) {
return DB::table($db . '.inventory')->where('inventoryid', $id)->get();
}
а затем, в коде, мы отправляем $db в качестве параметра:
$inventory = Inventory::inventory('data_2016', 2);
Таким образом, вам не нужно определять соединение для каждой из разных баз данных и не переделывать файлы конфигурации базы данных.
Единственным недостатком является то, что вы не можете напрямую использовать модель, вместо этого вам нужно использовать помощник DB.
Вы можете изменить это, так как Laravel 5.x или 6.x
config(['database.default' => 'databasename']);
Где databasename
должен быть указан в config/database
в массиве connections
.