【问题标题】:Search related data in different data base在不同的数据库中搜索相关数据
【发布时间】:2016-12-01 16:45:46
【问题描述】:

我使用 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: 

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

【问题讨论】:

    标签: sql database yii2


    【解决方案1】:
    1. 在应用程序的配置中配置您的第二个数据库组件。
    2. 覆盖 ActiveRecord 模型中的 getDB() 函数以返回第二个数据库组件。

    这会将您的模型附加到辅助数据库,并允许您从辅助数据库中的表进行查询。

    配置示例:

    '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;  
        }
    }
    

    祝你好运!

    【讨论】:

    • @Abdula 我有这样的连接,因为在我的项目中,我将两个数据库都用于不同的部分,但是当我尝试替换'getBD()'时,我得到不同的错误:'表格没有存在:选项卡'。所以通过这种方式,我与第一个主要模型不再有联系。这是我想念的东西吗?
    • Tab 就是一个例子。您的实际课程需要基于您的架构。为了更好地理解您的场景,我需要查看您的架构。可以分享一下吗?
    【解决方案2】:

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

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

    但是,如果来自不同数据库的表位于不同的服务器上,则连接它们时要小心——这可能会非常慢。

    如果您只想获取相关数据(WHERE 中未使用连接表),请使用 with() 而不是 joinWith()。这将使用IN 语句作为单独的查询执行。在大多数情况下,这种方式具有更好的性能,并且对于不同的源(甚至不同的 DBMS)没有问题。

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

    【讨论】:

    • TX.现在可以了。与连接。我刚刚添加到每个模型函数 'public static function tableName() { return 'db1.Tab'; }' 和 'public static function tableName() { return 'db2.Tab2'; }' 用于下一个表,它可以工作。
    • @Alexei 好。乐意效劳。请用您的最终代码更新答案,并将其标记为已解决。这可能对其他人有所帮助。并且不要忘记投票;-)
    猜你喜欢
    • 1970-01-01
    • 2017-05-16
    • 2019-02-07
    • 1970-01-01
    • 2012-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多