`

Lumen/laravel动态分库的实现

 
阅读更多
lumen默认支持多数据源,但如果系统存在多个结构相同的数据库实例,并根据某特定请求参数访问不同的实例,那么可以通过中间件实现动态配置。

1、在app/config/database.php文件中配置默认mysql数据库连接参数
2、在默认库中创建一个配置表,其中保存各数据库分库的配置,如下表(以corpid做分库条件),这个表只需要在主库中创建并维护
引用

CREATE TABLE `corp_database` (
  `corpid` varchar(50) NOT NULL DEFAULT '' COMMENT '租户id',
  `read_host` varchar(100) NOT NULL DEFAULT '' COMMENT '读库地址',
  `read_port` int(11) NOT NULL DEFAULT '3306' COMMENT '读库端口',
  `read_database` varchar(100) NOT NULL DEFAULT '' COMMENT '读库数据库名',
  `read_user` varchar(100) NOT NULL DEFAULT '' COMMENT '读库用户',
  `read_password` varchar(100) NOT NULL DEFAULT '' COMMENT '读库密码',
  `write_host` varchar(100) NOT NULL DEFAULT '' COMMENT '写库地址',
  `write_port` int(11) NOT NULL DEFAULT '3306' COMMENT '写库端口',
  `write_database` varchar(100) NOT NULL DEFAULT '' COMMENT '写库数据库名',
  `write_user` varchar(100) NOT NULL DEFAULT '' COMMENT '写库用户',
  `write_password` varchar(100) NOT NULL DEFAULT '' COMMENT '写库密码',
  `driver` varchar(100) NOT NULL DEFAULT 'mysql' COMMENT '驱动名称',
  `charset` varchar(100) NOT NULL DEFAULT 'utf8' COMMENT '字符集',
  `collation` varchar(100) NOT NULL DEFAULT 'utf8_unicode_ci',
  `prefix` varchar(100) NOT NULL DEFAULT '' COMMENT '数据表前缀',
  `timezone` varchar(100) NOT NULL DEFAULT '+00:00' COMMENT '时区',
  `strict` varchar(10) NOT NULL DEFAULT 'false' COMMENT '是否执行严格模式',
  PRIMARY KEY (`corpid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

3、创建一个corp_database的model类
class CorpDatabaseModel extends BaseModel{

	private $table = 'corp_database';
	public function  __construct(){
		parent::__construct();
		
	}
	
	public function  get($corpid){
	
		if(!$corpid){
			return null;
		}
		
		return app('db')->table($this->table)->where('corpid',$corpid)->first();
		
	}

    public function  getAndFormat($corpid){

        if(!$corpid){
            return null;
        }

        $r = app('db')->table($this->table)->where('corpid',$corpid)->first();
        if($r) {
            $result['read']['host'] = $r['read_host'];
            $result['read']['port'] = $r['read_port'];
            $result['read']['database'] = $r['read_database'];
            $result['read']['username'] = $r['read_username'];
            $result['read']['password'] = $r['read_password'];
            $result['write']['host'] = $r['write_host'];
            $result['write']['port'] = $r['write_port'];
            $result['write']['database'] = $r['write_database'];
            $result['write']['username'] = $r['write_username'];
            $result['write']['password'] = $r['write_password'];
            $result['driver'] = $r['driver'];
            $result['charset'] = $r['charset'];
            $result['collation'] = $r['collation'];
            $result['prefix'] = $r['prefix'];
            $result['timezone'] = $r['timezone'];
            $result['strict'] = $r['strict'];
            return $result;
        } else {
            return null;
        }
    }

    /**
     * @param $save_array
     * @return mixed
     */
    public function save($save_array){

        return app('db')->db()->table($this->table)->insertGetId($save_array);

    }

    public function modifyById($id, $data =array()){
        if(!$id){
            return 0;
        }
        if(!count($data)){
            return 0;
        }
        return app('db')->db()->table($this->table)->where('coprid',$id)->update($data);
    }
}

4、在app/Http/Middleware/xxxMiddleware.php(自行在routes.php中配置生效)中添加以下代码
……
public function handle($request, Closure $next) {
        $corpId = $request->get('corpid', '');
        if($corpId) {
            $corpDatabaseModel = new CorpDatabaseModel();
            $dbConfig = $corpDatabaseModel->getAndFormat($corpId);
            if($dbConfig) {
                config(['database.connections.' . $corpId => $dbConfig]);
                config(['database.default' => $corpId]);
            }
        }
……
}
……

5、通过中间件修改数据库组件的默认链接名称实现动态分库。这样内部代码不需要做任何特殊处理即可实现对不同数据库分库的访问。
分享到:
评论

相关推荐

    laravel-amqp:Laravel和Lumen的AMQP包装器可以发布和使用消息

    amqp 用于Laravel和Lumen的AMQP包装器,用于发布和使用消息,尤其是来自RabbitMQ的消息特征高级队列配置轻松将消息添加到队列使用有用的选项监听队列安装作曲家将以下内容添加到composer.json中的require部分: ...

    laravel-wechat:用于Laravel的微信SDK,基于overtruewechat

    laravel-微信 用于Laravel / Lumen的微信SDK,基于 框架要求 overtrue / laravel-wechat:^ 5.1-> Laravel...composer require " overtrue/laravel-wechat:^5.1 " # overtrue/wechat 5.x composer require " overtrue/l

    lumen-passport, 使用Lumen制作 Laravel 护照.zip

    lumen-passport, 使用Lumen制作 Laravel 护照 lumen护照 使用Lumen制作 Laravel 护照一个简单的服务提供者,使 Laravel Passport与依赖项PHP> = 5.6.3流明> = 5.3通过Composer安

    Laravel开发-lumen-auth-acl

    在Lumen中,可以使用第三方库如`spatie/laravel-permission`来实现ACL。 **6. 安装和配置spatie/laravel-permission** 首先,通过Composer安装库: ```bash composer require spatie/laravel-permission ``` ...

    基于Lumen/AngularJS/Lumx的后台管理系统设计源码

    本资源提供了一套基于Lumen/AngularJS/Lumx开发的管理信息系统框架的设计源码。该项目包含了3003个PHP文件、606个JavaScript文件、206个CSS文件、187个SCSS文件、165个JSON文件、139个PHPT文件、119个Markdown文件、...

    laravel-apidoc-generator:Laravel API文档生成器

    Laravel API文档生成器从现有的Laravel / Lumen ... composer require --dev mpociot/laravel-apidoc-generatorLaravel通过运行以下命令发布配置文件: php artisan vendor:publish --provider= " Mpociot\ApiDoc\ApiDo

    Laravel开发-cors-lumen

    在Lumen中,我们可以使用第三方包如`barryvdh/laravel-cors`来实现CORS支持。首先,通过Composer安装此包: ```bash composer require barryvdh/lumen-cors ``` ### 配置CORS中间件 安装完成后,需要在`bootstrap/...

    laravel-postal-code-validation:Laravel和Lumen的全球邮政编码验证

    要求该软件包具有以下要求: PHP 7.2或更高Laravel(或流明)5.5或更高Laravel /流明版本套餐版本5.1-5.4 5.5及更高3.x安装您可以通过运行以下命令,使用Composer安装此软件包: composer require axlon/laravel-...

    Laravel源加密器:Laravel和Lumen源代码加密器

    第2步使用以下命令使用composer来打包: composer require --dev sbamtr/laravel-source-encrypter第三步对于Laravel 服务提供商将自动注册。 或者,您可以在config/app.php文件中手动添加服务提供商: 'providers' ...

    Laravel开发-laravel-amqp

    composer require "babenkoivan/laravel-amqp:^1.0" ``` 然后,在 Laravel 的配置文件 `config/queue.php` 中,添加一个新的连接配置,例如 `amqp`,指定 RabbitMQ 的连接参数。 ### 4. 创建队列监听器 Laravel ...

    Laravel开发-lumen-framework

    **Laravel 开发 - Lumen 框架详解** Lumen 是 Laravel 生态系统中的一个微型框架,由 Taylor Otwell 创建,专为构建 API 和 微服务架构而设计。Lumen 提供了与 Laravel 类似的语法和结构,但更加轻量级,性能更优,...

    Laravel开发-laravel-aspect

    而"laravel-aspect"则是Laravel框架的一个扩展,用于引入面向方面编程(Aspect-Oriented Programming, AOP)的概念到Laravel和Lumen环境中。面向方面编程是一种编程范式,旨在提高代码的可维护性和模块化,通过将...

    Laravel/Lumen 使用 Redis队列

    Laravel/Lumen 使用 Redis队列 Laravel/Lumen 框架提供了一个队列系统,允许开发者将耗时操作或高并发操作异步执行,以缓解系统压力、提高系统响应速度和负载能力。在这个系统中,Redis 可以作为队列驱动,负责存储...

    Laravel开发-pdf-lumen

    在本文中,我们将深入探讨如何使用Laravel框架与Lumen微服务架构来处理PDF文档的生成,特别是结合K98kurz/pdf库,一个基于dompdf的包装器。Laravel和Lumen是PHP世界中非常受欢迎的开源项目,分别用于构建全面的Web...

    Laravel开发-lumen-helpers

    例如,如果你在一个Laravel项目中使用了某种特定的日志配置,然后想将其应用于Lumen项目,Lumen-Helpers可以让你轻松实现这一目标。 **4. 视图(Views)支持** Lumen-Helpers添加了对Lumen的视图支持,允许你在...

    Laravel开发-laravel-ssh-tunnel-fixed

    composer require beyondcode/laravel-ssh-tunnel ``` 安装完成后,你需要在`config/app.php`的`providers`数组中注册服务提供者: ```php BeyondCode\LaravelSshTunnel\SshTunnelServiceProvider::class, ``` ...

    laravel-hashid:通过生成可逆的,非顺序的,URL安全的标识符来混淆数据

    $ composer require elfsundae/laravel-hashid 对于Lumen或v5.5之前的Laravel,您需要手动注册服务提供商: ElfSundae \ Laravel \ Hashid \ HashidServiceProvider ::class 然后发布配置文件: # For Laravel ...

    Laravel开发-lumen

    **Laravel 开发 - Lumen 框架详解** Lumen 是 Laravel 生态系统中的一个微型框架,由 Taylor Otwell 创建,专为构建 API 和 微服务 应用程序而设计。Lumen 提供了与 Laravel 相似的语法和结构,但更轻量级、性能更...

Global site tag (gtag.js) - Google Analytics