laravel动态多数据源(多数据库)

  首先介绍下该功能需求产生的过程,公司准备搭建云平台(小小吐槽一下,其实听上去高大上,虽然目前已基本完成,但是安全性,子平台数据传输这些我感觉还是存在不少问题的)来实现对现场项目的管理和运维工作。
  我们这个项目起初考虑是一个平台库,一个项目配置库(我们项目历史数据量比较大,所以本地项目分配置库和历史库)、一个项目历史库,然后我直接否决了,首先项目配置库把现场n个项目的备份拿回来之后然后放在一个配置库里这个操作就极难实现,让我考虑,我当然不考虑了,==!方案谁都能提,说实现简单我也能张口就来,实际操作怎样完全另一回事(配置库表之间关联性极强,还要考虑历史库数据存储对应关系),其次历史库数据在一起,时间久了数据库就炸了。虽然这样实现起来对我查询方便很多,但是最终还是决定使用一个平台库,n项目配置库,n项目历史库这样的方案。
  综上就产生了项目接口服务需要根据不同的请求动态切换数据源的需求。

  好了,前提介绍完了,开始进入正菜。

1,首先.env文件中添加云平台配置库的数据源

DB_CONNECTION=mysql
DB_HOST=**.**.***.**
DB_PORT=3306
DB_DATABASE=db_name
DB_USERNAME=user_name
DB_PASSWORD=password

2,实现n个项目配置库,n个历史库的动态添加
要实现动态添加,首先需要云平台中有对应的数据库名称,然后将这些数据库添加到数据库服务提供者中,这里就需要构造Providers中的DatabaseServiceProvider.php,如下在boot()中添加

        $codes = InServices::all(['code','his_db']);
        $databases = [];
        foreach ($codes as $code){
            array_push($databases,$code->code);
            array_push($databases,$code->his_db);
        }
        // $databases = explode(',',$codes);
        $new = [];
        foreach ($databases as $database){
            $new[$database] = [
                    'driver' => 'mysql',
                    'url' => env('DATABASE_URL'),
                    'host' => env('DB_HOST', '127.0.0.1'),
                    'port' => env('DB_PORT', '3306'),
                    'database' => $database,
                    'username' => env('DB_USERNAME_CFG', 'forge'),
                    'password' => env('DB_PASSWORD_CFG', ''),
                    'unix_socket' => env('DB_SOCKET', ''),
                    'charset' => 'utf8mb4',
                    'collation' => 'utf8mb4_unicode_ci',
                    'prefix' => '',
                    'strict' => false,
                    'engine' => null,
            ];
        }
        //dd($new);
        $this->app['config']['database.connections'] = array_merge($this->app['config']['database.connections'], $new);

这样就实现了将所有需要用到的数据源添加完成。
使用如下:

$task = \DB::connection($inService->his_db)->table('tasks')->where('user_id',$user->id)->get();

你可能感兴趣的:(laravel动态多数据源(多数据库))