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的表名变量,能从比较根源解决该问题
当然以上是在同一数据库服务器的前提下,才能跨库,跨服务器的跨库暂时没用方法
版权声明:本文为博主原创文章,未经博主允许不得转载。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· 因为Apifox不支持离线,我果断选择了Apipost!