搜索不同数据库中的相关数据

时间:2016-07-27 15:10:39

标签: sql database yii2

我使用yii2构建一个需要连接一些表的应用程序。我可以简单地加入他们并搜索相关领域的数据。我这样做是通过添加这样的连接>

public function getNextTab()
{
return  $this->hasOne(NextTab::className(),['id' =>'id_nexttab']);  
}

并使用像这样的搜索模型中的数据 - >

->where ('id'='ok') ->
->joinWith('nextTab')
->joinWith('nextTab.nextTab1')
->joinWith('nextTab.nextTab1.nextTab2');

我的问题是当我尝试使用来自不同数据库的表格时。该查询给我一个错误,如

SQLSTATE[42S02]: Base table or view not found: 

任何提示如何通过它?或者如何使用其他连接方式获取数据。

2 个答案:

答案 0 :(得分:1)

您的RDBMS可能不支持从不同数据库加入表(例如PostgreSQL)。但是如果支持(MSSQLMySQL),那么表名应该以数据库名称为前缀(如果需要,还应该使用模式)。您可以使用tableName()函数中的{{%TableName}} syntax在Yii2中实现此目的。

public static function tableName()
{
    return '{{%table_name}}';
}

但如果它们位于不同的服务器上,请小心加入来自不同数据库的表 - 这可能非常慢。

如果您只想获取相关数据(WHERE中未使用已加入的表格),请使用with()代替joinWith()。这将作为单独的查询与IN语句一起执行。在大多数情况下,这种方式具有更好的性能,并且不同来源(甚至不同的DBMS)也没有问题。

->with('nextTab', 'nextTab.nextTab1', 'nextTab.nextTab1.nextTab2')

答案 1 :(得分:0)

  1. 在应用程序的配置中配置第二个数据库组件。
  2. 覆盖ActiveRecord模型中的getDB()函数以返回第二个数据库组件。
  3. 这会将您的模型附加到辅助数据库,并允许您从辅助数据库中的表进行查询。

    配置样本:

    'components' => [
        'db2' => [
            'class' => 'yii\db\Connection',
            'dsn' => 'mysql:host=localhost;dbname=db2',
            'username' => 'hello',
            'password' => 'world',
        ],
    ],
    

    getDB()函数覆盖示例:

    class Tab extends ActiveRecord
    {
        public static function getDb()
        {
            // use the "db2" component
            return \Yii::$app->db2;  
        }
    }
    

    祝你好运!