同库多表前缀

[问题描述,请详细说明具体的问题]

我之前使用thinkphp开发的接口程序,前两天看到了phalApi,想换成这个来重新写过,但发现有些问题不好解决,想请求支持一下。
我的场景是有有多个公司,相同的应用场景,所以之前写的是在一个数据库里有上千个表,整个集团公司共用数据表有10多个,其它的每个公司的数据表是以一个不同的前缀来标识的,
但不同公司非公共表的结构是相同的,只是前缀不同。如下:
公共表: sys_user,sys_company,sys_token,等等
公司1: wd00_a,wd00_b,wd00_c,wd00_d
公司2: wd01_a,wd01_b,wd01_c,wd01_d
公司3: wd02_a,wd02_b,wd02_c,wd02_d
公司4: wd03_a,wd03_b,wd03_c,wd03_d

我如何配置数据库联接信息,当我界面上根据权限,可以切换成不同的公司,登录时获得了token,操作界面传过来的token在接口中接受到对应的token值,token里有公司的信息比如wd00,wd01,wd02,切换公司时重新获得新的token,然后根据这些信息自动判断是当个公司就是表前缀,如何实现这个配置?

 
已邀请:

无巧

赞同来自: Hishenglin

谢谢,这样也可以。
建议在config中增加set方法动态修改表前缀。
 
// 数据操作 - 基于NotORM
$dbcfg = $di->config->get('dbs');
$dbcfg['tables']['__default__']['prefix'] = 'sys_';
$di->notorm = new NotORMDatabase($dbcfg, $di->debug);

 

无巧

赞同来自:

我后来研究了一下数据库参数:
return array(
    /**
     * DB数据库服务器集群
     */
    'servers' => array(
        'db_master' => array(                       //服务器标记
            'type'      => 'mysql',                 //数据库类型,暂时只支持:mysql, sqlserver
            'host'      => '127.0.0.1',             //数据库域名
            'name'      => 'phalapi',               //数据库名字
            'user'      => 'root',                  //数据库用户名
            'password'  => '',                        //数据库密码
            'port'      => 3306,                    //数据库端口
            'charset'   => 'UTF8',                  //数据库字符集
        ),
    ),

    /**
     * 自定义路由表
     */
    'tables' => array(
        //通用路由
        '__default__' => array(
            'prefix' => 'tbl_',
            'key' => 'id',
            'map' => array(
                array('db' => 'db_master'),
            ),
        ),

        /**
        'demo' => array(                                                //表名
            'prefix' => 'tbl_',                                         //表名前缀
            'key' => 'id',                                              //表主键名
            'map' => array(                                             //表路由配置
                array('db' => 'db_master'),                               //单表配置:array('db' => 服务器标记)
                array('start' => 0, 'end' => 2, 'db' => 'db_master'),     //分表配置:array('start' => 开始下标, 'end' => 结束下标, 'db' => 服务器标记)
            ),
        ),
         */
    ),
);
 
需要把数据库参数改造一下并把封装地方进行处理,在注入时指定参数即可。
比如:
   'tables' => array(
        //通用路由
        '__sys__' => array(
            'prefix' => 'tbl_',
            'key' => 'id',
            'map' => array(
                array('db' => 'db_master'),
            ),
        ),
        '__wd01__' => array(
            'prefix' => 'tbl_',
            'key' => 'id',
            'map' => array(
                array('db' => 'db_master'),
            ),
        ),
        '__wd02__' => array(
            'prefix' => 'tbl_',
            'key' => 'id',
            'map' => array(
                array('db' => 'db_master'),
            ),
        ),
        '__wd03__' => array(
            'prefix' => 'tbl_',
            'key' => 'id',
            'map' => array(
                array('db' => 'db_master'),
            ),
        ),
}
 
标准定义:凡是__****__  的key就为通用路由,系统默认为sys或者其它,但可以在di注入时指定。
 
需要调整相关代码对参数的兼容。
 
// 数据操作 - 基于NotORM
$di->notorm = new NotORMDatabase($di->config->get('dbs'), $di->debug);
变为 $di->notorm = new NotORMDatabase($di->config->get('dbs'),'__sys__', $di->debug);
 
理论上就可以实现。
大家给点支持。

dogstar - PhalApi创始人

赞同来自:

每个公司的数据表是以一个不同的前缀来标识的


对于这个问题,我的理解是可以简单通过动态配置表前缀来实现。
 
在识别是哪个表前缀后,在入口处或在./config/dbs.php文件动态传入不同的表前缀:
        //通用路由
'__default__' => array(
'prefix' => 'tbl_', // 动态修改这里的表前缀
'key' => 'id',
'map' => array(
array('db' => 'db_master'),
),
),
其他保持不变。
 
更多可参考2.x文档:http://docs.phalapi.net/#/v2.0/database-multi

要回复问题请先登录注册