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

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

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

  • 相关阅读:
    如何快速取得股票交易历史数据
    ArcSDE性能优化系列之ArcSDE参数篇
    2020年8月29日
    2020年8月31日
    9.2
    2020年8月25日
    2020年8月30日
    2020年8月27日
    2020年8月26日
    2020年8月28日
  • 原文地址:https://www.cnblogs.com/cxscode/p/8178952.html
Copyright © 2020-2023  润新知