Php Yii2:是否可以使用JOIN同时查询两个数据库?
我有一个关于Yii2的项目。我有两个数据库。我需要执行带有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
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();