Изменение времени подключения базы данных laravel

Мне нужно изменить соединение базы данных laravel 5 во время выполнения.

Есть ли у вас какие-либо идеи?

Пожалуйста, поделитесь со мной.

Спасибо.

Ответ 1

Обновление: этот ответ с 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);

Но опять же, я лично не думаю, что это хорошая идея, и мне кажется, что все может запутаться и очень быстро развалиться, поскольку ваше приложение усложняется.

Ответ 2

Вы можете изменить данные о соединении во время выполнения, используя

Config::set('database.connections.mysql.database', 'other_database');

но не забудьте очистить до удаления кеша

DB::purge('mysql');

Ответ 3

У нас есть аналогичный сценарий, где искать исторические данные, мы меняем базу данных. В модели мы используем следующее:

public function inventory($db, $id) {
  return DB::table($db . '.inventory')->where('inventoryid', $id)->get();
}

а затем, в коде, мы отправляем $db в качестве параметра:

$inventory = Inventory::inventory('data_2016', 2);

Таким образом, вам не нужно определять соединение для каждой из разных баз данных и не переделывать файлы конфигурации базы данных.

Единственным недостатком является то, что вы не можете напрямую использовать модель, вместо этого вам нужно использовать помощник DB.

Ответ 4

Вы можете изменить это, так как Laravel 5.x или 6.x

config(['database.default' => 'databasename']);

Где databasename должен быть указан в config/database в массиве connections.