Yii2:JOIN可以同时查询2个数据库吗?

时间:2015-04-27 17:39:05

标签: php mysql sql join yii2

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

SELECT * FROM `table1` LEFT JOIN `table2` ON `table1`.`id` = `table2`.`id`;

..其中table1来自db1table2来自db2。注意:db2在另一台服务器上。

        '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上? ..或唯一的方法是从table1table2分离结果,然后循环比较id

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

$query = Table1::find();
$query2 = Table2::find();
// how compare id?

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

4 个答案:

答案 0 :(得分:2)

无法在MySQL中的两个不同数据库之间执行JOIN。但是,Yii的ActiveRecord关系系统并没有使用JOIN来检索相关数据,而是使用单独的" IN" query,它允许它跨不同的数据库甚至不同的DBMS类型检索关系数据。

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

答案 1 :(得分:0)

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

但如果数据量很大,则需要花费大量时间

答案 2 :(得分:0)

联合表是一种选择。

如果两个数据库都在同一个数据库实例上,那么使用表名指定模式就很容易做到:

df %>%
  mutate(month = factor(month, levels = c(3, 1, 2))) %>%
  ggplot(aes(x = month, y = n_assets)) +
  geom_bar(stat = "identity") +
  geom_text(aes(label = n_assets), vjust = -0.5, color = "black", size = 3) +
  facet_wrap(~ Asset_Class) + 
  scale_x_discrete(labels = function(x) month.abb[as.numeric(as.character(x))])

现在您也可以执行子查询:

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

答案 3 :(得分:0)

您可以在db2中为table1创建视图,并使用该视图进行联接。 但是正如您所提到的,db2在另一台服务器上,那么进行联接将是昂贵的操作。