我在Yii2上有项目。我有2个数据库。我需要用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上?
..或唯一的方法是从table1
和table2
分离结果,然后循环比较id
?
Q2:如何比较id
中yii2中的dataProvider
?
$query = Table1::find();
$query2 = Table2::find();
// how compare id?
$dataProvider = new ActiveDataProvider([
'query' => $query,
]);
答案 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在另一台服务器上,那么进行联接将是昂贵的操作。