Yii2 跨库orm实现

近期在对公司的Yii2项目进行子系统拆分,过度阶段难免会有一些跨库操作,原生语句还好,加下库名前缀就可以了,可是到了orm问题就来了,特别是用到model做查询的时候,现在来记录一下跳过的坑,

像下面是通过Order的Model类的getUser方法去关联user表,如果order在库2,user在库1,就会默认关联库2的user表,然后找不到表

1
2
order::find()->alias('o');
$query->innerJoinWith('user');

  

有一个简单的处理方法

1
2
order::find()->alias('o');
$query->innerJoin('db1.user u', 'u.user_id = c.user_id');

改成通过传链表参数链表即可。

 

如果使用innerJoinWith的地方很多怎么办呢?

另一种解决方法便是如下,

1
2
3
4
5
6
7
8
9
10
11
public static function tableName()
 {
     preg_match("/dbname=([^;]+)/i", self::getDb()->dsn, $matches);
     return $matches[1] . '.table_name2';
     //return '{{%table_name2}}';
 }
 
 public static function getDb()
 {
     return Yii::$app->get('db2');
 }

在其model文件中这样定义tableName方法,通过正则获取表对应的数据库前缀,拼接到return的表名变量,能从比较根源解决该问题

 

当然以上是在同一数据库服务器的前提下,才能跨库,跨服务器的跨库暂时没用方法

 

版权声明:本文为博主原创文章,未经博主允许不得转载。

 

posted @   程序生(Codey)  阅读(1403)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· 因为Apifox不支持离线,我果断选择了Apipost!
点击右上角即可分享
微信分享提示