翼度科技»论坛 编程开发 PHP 查看内容

thinkphp5框架的model支持多地区数据库切换

6

主题

6

帖子

18

积分

新手上路

Rank: 1

积分
18
1、说明

一般情况下,都是在model中指定一个数据库连接参数即可。但某些情况下,相同的库表会在不同地区都有部署,这个时候需要按地区进行切换(只有一个model情况下)。
2、多model继承方式

Model层代码
  1. //A地区的数据库
  2. class A extends Model
  3. {
  4.     protected $connection = 'xxx';
  5.     protected $table = 'xxx';
  6.     //其他操作方法
  7. }
  8. //B地区的数据库
  9. class B extend A
  10. {
  11.     protected $connection = 'xxx';
  12.     protected $table = 'xxx';
  13. }
复制代码
使用A地区的数据库:$model = new A();
使用B地区的数据库:$model = new B();
3、单model重写构造方法

需要更改地方:config.php配置、重写Model的构造方法

  • config.php
点击查看代码
  1. return [
  2.     "hk" => [
  3.         "xxx" => [xxx],//具体的数据库连接参数
  4.     ],
  5.     "sg" => [
  6.         "xxx" => [xxx],//具体的数据库连接参数
  7.     ],
  8. ];
复制代码

  • 新建一个BaseModel重写Model的构造方法
点击查看代码
  1. //自定义Model基类
  2. class BaseModel extends Model
  3. {
  4.     /**
  5.      * 多地区数据库配置
  6.      * 其中的值必须在config中配置的数据库配置:Config::get('hk.xxx')
  7.      * 例如:[
  8.      *      'hk' => 'hk.xxx',
  9.      *      'sg' => 'sg.xxx'
  10.      * ]
  11.      * @var array
  12.      */
  13.     protected $multi_connections = [];
  14.     protected $multi_connections_key;
  15.     //重写构造方法
  16.     public function __construct($data = [])
  17.     {
  18.         //通过new model('xx.xx')设置 connection => 多地区数据库
  19.         if (is_string($data)) {
  20.             $this->multi_connections_key = $data;//记录当前的地区key
  21.             if ($conn = $this->multi_connections[$data]) {
  22.                 //此时:data=hk
  23.                 $this->connection = $conn;
  24.             } else {
  25.                 //此时:data=hk.xx,且必须设置配置文件
  26.                 $this->connection = $data;
  27.             }
  28.             $data = [];
  29.         }
  30.         parent::__construct($data);
  31.     }
  32. }
复制代码

  • 在model中使用
点击查看代码
  1. class A extends BaseModel
  2. {
  3.     //多地区数据库配置(下面支持sg和kr地区的切换)
  4.     protected $multi_connections = [
  5.         'sg' => 'sg.xxx',
  6.         'kr' => 'kr.xxx',
  7.     ];
  8. }
复制代码

  • 在控制器中进行使用
url设置:http://xxx?region=xxx
点击查看代码
  1. class Demo extends Controller
  2. {
  3.     public $region;
  4.     protected $mod;
  5.     public function _initialize()
  6.     {
  7.         //获取当前需要的地区,默认hk
  8.         $this->region = input('region', 'hk');
  9.         //根据地区进行new Model
  10.         $this->mod = new A($this->region);
  11.     }
  12.     //测试方法
  13.     public function index()
  14.     {
  15.         //这里可以使用model的方法
  16.         $data = $this->model->xxx()
  17.     }
  18. }
复制代码
来源:https://www.cnblogs.com/reader/p/17635353.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具