@reech

Как работать с несколькими соединениями БД?

В админке нужно переключаться на удаленные mysql бд. Можно ли настройки для подключения к удаленным бд хранить в таблице основной базы?

Все примеры работы с несколькими бд сводятся к написанию настроек руками в файле app/config/database.php
Количество баз будет увеличиваться и хотелось бы добавлять настройки из админки, а не руками в файл. Подскажите, как это реализовать?
  • Вопрос задан
  • 225 просмотров
Решения вопроса 1
wielski
@wielski
✔ Совет: Вам помогли? Отметьте ответы решением.
Храните базы данных в конфиге.

И так, ваш конфиг database.php выглядит примерно так:
<?php
return array(

    'default' => 'mysql',

    'connections' => array(

        'mysql' => array(
            'driver'    => 'mysql',
            'host'      => 'host1',
            'database'  => 'database1',
            'username'  => 'user1',
            'password'  => 'pass1'
            'charset'   => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix'    => '',
        ),

    ),
);


В connections надо добавлять данные новой БД.
Примерный код хелпера для работы с конфигами (app/helpers/ConfigHelper.php):

<?php
namespace App\Helpers;
use Illuminate\Config\FileLoader;

class ConfigHelper
{
    static public function save($items, $config, $addon = '')
    {
        $path = base_path()."/config/{$addon}";
        $file = "{$path}/{$config}.php";
        \File::put($file, '<?php return ' . var_export($items, true) . ';');
    }

    static public function drop($config, $addon = ''){
        $path = base_path()."/config/{$addon}";
        $file = "{$path}/{$config}.php";
        \File::delete($file);
    }
}


Примерный код создания нового соединения:
$database = config('database');
$database['connections']['mysql2'] = array(
            'driver'    => 'mysql',
            'host'      => 'host2',
            'database'  => 'database2',
            'username'  => 'user2',
            'password'  => 'pass2'
            'charset'   => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix'    => '',
        );
\App\Helpers\ConfigHelper::save($database, 'database');


Для работы с новым соединением достаточно прописать в модели параметр connection
<?php

class SomeModel extends Eloquent {

    protected $connection = 'mysql2';

}


Либо использовать "горячую" настройку:
$users = DB::connection('mysql2')->select(...);
Schema::connection('mysql2')->create('some_table', function($table)
{
    $table->increments('id'):
});

<?php

class SomeController extends BaseController {

    public function someMethod()
    {
        $someModel = new SomeModel;

        $someModel->setConnection('mysql2');

        $something = $someModel->find(1);

        return $something;
    }

}


И т.д. по аналогии.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы