Php Yii2:是否可以使用JOIN同时查询两个数据库?

Php Yii2:是否可以使用JOIN同时查询两个数据库?,php,mysql,sql,join,yii2,Php,Mysql,Sql,Join,Yii2,我有一个关于Yii2的项目。我有两个数据库。我需要执行带有join的命令,就像 SELECT * FROM `table1` LEFT JOIN `table2` ON `table1`.`id` = `table2`.`id`; …其中table1来自db1和table2来自db2。注意:db2位于另一台服务器上 'db1' => [ 'class' => 'yii\db\Connection', 'dsn' =&g

我有一个关于Yii2的项目。我有两个数据库。我需要执行带有
join
的命令,就像

SELECT * FROM `table1` LEFT JOIN `table2` ON `table1`.`id` = `table2`.`id`;
…其中
table1
来自
db1
table2
来自
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? .. 或者,唯一的方法是分别从
表1
表2
获取结果,然后循环比较
id

Q2:如何在
数据提供程序中比较yii2中的
id

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

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

在MySQL中,不可能在两个不同的数据库之间执行连接。然而,Yii的ActiveRecord关系系统并没有使用连接来检索相关数据,而是使用一个单独的“IN”查询,它可以跨不同的数据库甚至不同的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');

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

但如果数据量很大,则使用联邦表将花费大量时间

MySQL示例

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

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

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';
    }
    ....
}
现在您还可以进行子查询:

$subQuery = TableB::find()
    ->select('id')
    ->where(['column' => 'criteria'])
    ->column();

$query = TableA::find()
    ->join(['b' => $subQuery], 'b.column_pk = a.column_fk')
    ->all();

您可以在db2中为table1创建视图,并与该视图进行连接。
但是正如您所提到的,db2位于另一台服务器上,那么进行连接将是一项代价高昂的操作。

忽略python部分的可能重复-这是一个mysql问题。这是一个Yi2问题,因为活动记录的工作方式,默认情况下,Yi2使用指定数据库的连接。要使用两个数据库之间的关系,必须在模型表定义中指定db。这是可能的,但需要在模型中使用表名指定架构,假设两个数据库位于同一服务器上。另一个选项是联合表。如果不正确,请参阅下面的联合引擎答案。
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';
    }
    ....
}
$subQuery = TableB::find()
    ->select('id')
    ->where(['column' => 'criteria'])
    ->column();

$query = TableA::find()
    ->join(['b' => $subQuery], 'b.column_pk = a.column_fk')
    ->all();