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 помощник.