Yii2 跨库orm实现

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

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

order::find()->alias(‘o‘);
$query->innerJoinWith(‘user‘);

  

有一个简单的处理方法

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

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

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

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

   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的表名变量,能从比较根源解决该问题

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

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

原文地址:https://www.cnblogs.com/cxscode/p/8178952.html

时间: 2024-10-31 14:45:14

Yii2 跨库orm实现的相关文章

Thinkphp3.1 跨库连接数据库。

Thinkphp3.1 跨库连接数据库. 在配置文件里首页默认的是连接mysql 然后我在下面加了个数组://mssql配置'DB_MSSQL'  =>array(//'DB_CHARSET'=>'GBK2312','DB_TYPE'   => 'mssql','DB_HOST'   => '152.198.11.156','DB_NAME'   => 'TOOT','DB_USER'   => 'sa','DB_PWD'    => '123456','DB_P

重大发现Discuz DB层跨库映射关系表名前缀BUG

场景: 在Discuz中创建Table模型,但该Table所在库与Discuz不在同一个库. Discuz好像是在3之后提供跨库映射的机制. 映射没问题,主要是发现表名前缀没有相应的映射过来.当然,其实也不算bug.因为他只考虑discuz自己的系统,一般来说,表名前缀是相同的. 在db驱动类里,db_driver_mysql(i): function table_name中 if(!empty($this->config[$id]['tablepre'])){ $this->tablepre

跨库的效果以及方案

1.通过跨库找到他们共同的数据 2.用<>实现过滤或者填充 3.利用jump display加正则实现过滤或者填充

Oracle 跨库 查询 复制表数据

在目前绝大部分数据库有分布式查询的需要.下面简单的介绍如何在oracle中配置实现跨库访问. 比如现在有2个数据库服务器,安装了2个数据库.数据库server A和B.现在来实现在A库中访问B的数据库. 第一步.配置A服务器端的tnsnames.ora文件(TNSNAMES.ORA Network Configuration File),该文件存放的位置为: $ORACLE_HOME/network/admin/tnsnames.ora 需要在该文件中增加对B库的配置项,格式如下 ZBCDB3

一个简单的跨库事务问题

什么是数据结构? 数据结构是相互之间存在一种或多种特定关系的数据元素的集合. 还有一些概念(数据.数据元素.数据项.数据对象.数据类型...) 传统上,我们把数据结构分为逻辑结构和物理结构. 逻辑结构:是指数据对象中数据元素之间的相互关系,也是我们今后最需要关注和讨论的问题. 物理结构:是指数据的逻辑结构在计算机中的存储形式. 逻辑结构分为以下四种: 1.集合:集合结构中的数据元素除了同属于一个集合外,之间没有任何关系. 2.线性结构:元素之间一对一. 3.树形结构:一对多. 4.图形结构:多对

SQLServer跨库查询--分布式查询

出处:http://www.cnblogs.com/doosmile/archive/2012/03/16/2400646.html --用openrowset连接远程SQL或插入数据 --如果只是临时访问,可以直接用openrowset --查询示例 select * from openrowset('SQLOLEDB' ,'sql服务器名';'用户名';'密码' ,数据库名.dbo.表名) 在跨库查询时需要启用Ad Hoc Distributed Queries启用Ad Hoc Distri

SQL Server 跨库同步数据

最近有个需求是要跨库进行数据同步,两个数据库分布在两台物理计算机上,自动定期同步可以通过SQL Server代理作业来实现,但是前提是需要编写一个存储过程来实现同步逻辑处理.这里的存储过程用的不是opendatasource,而是用的链接服务器来实现的.存储过程创建在IP1:192.168.0.3服务器上,需要将视图v_custom的客户信息同步到IP2:192.168.0.10服务器上的t_custom表中.逻辑是如果不存在则插入,存在则更新字段. 1 create PROCEDURE [db

Oracle 跨库 查询 复制表数据 分布式查询

方法一: 在眼下绝大部分数据库有分布式查询的须要.以下简单的介绍怎样在oracle中配置实现跨库訪问. 比方如今有2个数据库服务器,安装了2个数据库.数据库server A和B.如今来实如今A库中訪问B的数据库. 第一步.配置Aserver端的tnsnames.ora文件(TNSNAMES.ORA Network Configuration File),该文件存放的位置为: $ORACLE_HOME/network/admin/tnsnames.ora 加入例如以下行,当中DBLINK为连接名(

SQL Server跨库访问

MSSQLServer不同服务器数据库之间的数据操作 方法1: --创建链接服务器 exec sp_addlinkedserver   'ITSV ', ' ', 'SQLOLEDB ', '远程服务器名或ip地址' exec sp_addlinkedsrvlogin  'ITSV ', 'false ',null, '用户名', '密码' --查询示例 select * from ITSV.数据库名.dbo.表名 --导入示例 select * into 表 from ITSV.数据库名.db