laravel изменить время выполнения подключения к базе данных
Мне нужно изменить соединение с базой данных laravel 5 во время выполнения.
У вас есть какие-либо идеи об этом?
пожалуйста, поделитесь со мной.
спасибо.
3 ответов
Ну, мой немедленный ответ на это:нет. скорее всего, вы можете выполнить свою задачу, изменив модель данных и работая с более продвинутыми отношениями. Трудно сказать, не зная, что вы хотите сделать, но мне кажется, что это плохая идея в целом, особенно если вы планируете использовать красноречивые модели и так далее
тем не менее, в некоторых сценариях, где вам действительно нужно изменить данные в другой базе данных или выполнить какой-то необработанный запрос, вы можете используйте DB::connection()
метод. Что-то вроде:
$data = DB::connection('another_connection')->select(...);
вы можете указать, что another_connection
переменной в свой . Вот так:
<?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 помощник.