首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Yii2:使用JOIN可以同时查询两个数据库吗?

问Yii2:使用JOIN可以同时查询两个数据库吗?
EN

Stack Overflow用户
提问于 2015-04-27 17:39:04
回答 4查看 4.2K关注 0票数 3

我在Yii2上有项目。我有两个数据库。我需要使用join执行命令,比如

代码语言:javascript
复制
SELECT * FROM `table1` LEFT JOIN `table2` ON `table1`.`id` = `table2`.`id`;

..where table1来自db1,table2来自db2。注意:db2位于另一台服务器上。

代码语言:javascript
复制
        'db1' => [
            'class' => 'yii\db\Connection',
            'dsn' => 'mysql:host=localhost;dbname=db1',
            'username' => '...',
            'password' => '...',
            'charset' => 'utf8',
        ],
        'db2' => [
            'class' => 'yii\db\Connection',
            'dsn' => 'mysql:host=anotherserver.com;dbname=db2',
            'username' => '...',
            'password' => '...',
            'charset' => 'utf8',
        ]

Q1:如何在干净的mysql/php上做到这一点?在Yii2上?或者,唯一的方法是从分离的table1和table2中获取结果,然后循环比较id

Q2:如何在dataProvider中比较yii2中的id

代码语言:javascript
复制
$query = Table1::find();
$query2 = Table2::find();
// how compare id?

$dataProvider = new ActiveDataProvider([
    'query' => $query,
]);
EN

回答 4

Stack Overflow用户

发布于 2015-05-05 21:45:55

在MySQL中不可能在两个不同的数据库之间执行连接。然而,Yii的ActiveRecord关系系统并不使用联接来检索相关数据,而是使用单独的"IN“查询,它可以跨不同的数据库甚至不同的DBMS类型检索关系数据。

代码语言:javascript
复制
class Table1 extends ActiveRecord {
    public static function getDb()
    {
        return Yii::$app->db1;
    }

    public function getTable2()
    {
        return $this->hasMany(Table2::class, ['id' => 'id']);
    }
}

class Table2 extends ActiveRecord {
    public static function getDb()
    {
        return Yii::$app->db2;
    }
}

$query = Table1::find()->with('table2');
票数 2
EN

Stack Overflow用户

发布于 2016-02-12 19:15:37

您可以分别获取第一个表和第二个表的结果,然后在php中执行联接操作。

但是,如果数据是巨大的,它将需要大量的时间。

票数 0
EN

Stack Overflow用户

发布于 2020-06-30 13:00:47

使用联邦表

MySQL示例

​

​

代码语言:javascript
复制
CREATE TABLE test_table (
    id     INT(20) NOT NULL AUTO_INCREMENT,
    name   VARCHAR(32) NOT NULL DEFAULT '',
    other  INT(20) NOT NULL DEFAULT '0',
    PRIMARY KEY  (id),
    INDEX name (name),
    INDEX other_key (other)
)
ENGINE=MyISAM
DEFAULT CHARSET=utf8mb4;

请参阅创建联邦表

联邦存储引擎允许您访问远程MySQL数据库中的数据,而无需使用复制或群集技术。查询本地联邦表会自动从远程(联邦)表中提取数据。本地表上不存储任何数据。

相同连接w/不同模式

代码语言:javascript
复制
db_conn---> db1 -> tableA
        |
        |-> db2 -> tableB

如果两个数据库都位于同一个db连接实例上,那么如果使用如下表名指定模式,则很容易做到这一点:

代码语言:javascript
复制
Class TableA extends \yii\db\ActiveRecord
{
    ...
    public static function tableName()
    {
        return 'databaseA.tableA';
    }
    ....
}

Class TableB extends \yii\db\ActiveRecord
{
    ...
    public static function tableName()
    {
        return 'databaseB.tableB';
    }
    ....
}

现在,您还可以执行子查询:

代码语言:javascript
复制
$subQuery = TableB::find()
    ->select('id')
    ->where(['column' => 'criteria'])
    ->column();

$query = TableA::find()
    ->join(['b' => $subQuery], 'b.column_pk = a.column_fk')
    ->all();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29902470

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档