我在Yii2上有项目。我有两个数据库。我需要使用join执行命令,比如
SELECT * FROM `table1` LEFT JOIN `table2` ON `table1`.`id` = `table2`.`id`;..where 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上?或者,唯一的方法是从分离的table1和table2中获取结果,然后循环比较id
Q2:如何在dataProvider中比较yii2中的id
$query = Table1::find();
$query2 = Table2::find();
// how compare id?
$dataProvider = new ActiveDataProvider([
'query' => $query,
]);发布于 2015-05-05 21:45:55
在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');发布于 2016-02-12 19:15:37
您可以分别获取第一个表和第二个表的结果,然后在php中执行联接操作。
但是,如果数据是巨大的,它将需要大量的时间。
发布于 2020-06-30 13:00:47
使用联邦表
MySQL示例

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/不同模式
db_conn---> db1 -> tableA
|
|-> db2 -> tableB如果两个数据库都位于同一个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();https://stackoverflow.com/questions/29902470
复制相似问题