【问题标题】:YII2 creating relations in models between tables from 2 databasesYII2 在来自 2 个数据库的表之间的模型中创建关系
【发布时间】:2016-04-05 06:46:53
【问题描述】:

我已经定义了 2 个数据库,例如

return [
'components' => [
    'db1' => [
        'class' => 'yii\db\Connection',
        'dsn' => 'mysql:host=localhost;dbname=db1name', 
        'username' => 'db1username',
        'password' => 'db1password',
    ],
    'db2' => [
        'class' => 'yii\db\Connection',
        'dsn' => 'mysql:host=localhost;dbname=db2name', 
        'username' => 'db2username',
        'password' => 'db2password',
    ],
],
];

现在我在“db1”中有一个“users”表,在“db2”中有一个“countries”表

users 
id , country_code , username , password
1  , DE           , xyz      , 12345
2  , FR           , abc      , 12345

countries
code , name
DE   , Germany
FR   , France
IN   , India

我已经定义了 users.country_code 和 countries.code 之间的外键关系

问题

但是当我尝试使用 gii 为“用户”表创建模型时,它会出错,可能是因为表关系来自 2 个不同的数据库。 如何在模型关系中使用来自不同数据库的表。

欢迎提出建议

【问题讨论】:

  • 我认为 gii 使用了存储在db 中的数据库连接。因此它会产生一个错误(如this)。
  • This 可以提供帮助。您应该在模型类中覆盖 getDb()
  • 嗨,robsch,我已经检查了您提供的链接,但是如果您可以让我知道在涉及多个数据库时如何创建连接语句,对于单个数据库中的表,它是这样的 - ' joinrel'=>array(self::BELONGS_TO,'User','code'),
  • 您是否已经有任何可以提供的代码?在 SQL 中,表需要以它们的数据库名称为前缀以进行真正的连接。然后它应该工作。 Yii2 必须意识到这一点。如果您覆盖 getDb(),我会预料到会发生这种情况。根据guide,我认为这会很简单......到目前为止你编码了什么,你得到了什么错误?请更新您的帖子。
  • 当要使用 Gii 生成模型时,可以选择使用哪个 db 连接。默认是“db”,你应该写 db1。 Leter,当您使用 Gii 生成模型时,您可以在 User 模型中编写关系查询,并且该关系将引用您的国家模型。

标签: yii2 relationship yii2-advanced-app multiple-databases yii2-model


【解决方案1】:

在我的情况下,这适用于在 GridView::widget 上列出iten

-> bd_sisarc is my secound data base
-> deposito_sondagem is a table from my first data base


public static function getDb()   // on your model
{
    return Yii::$app->get('db1');
}

public static function getDb()   // on your model
{
    return Yii::$app->get('db2');
}

public function getEmpresaSondagem()  // Relation on you model
{
    return $this->hasOne(EmpresaSondagem::className(), ['idEmpSondagem' => 'entidade_deposito']);
}





public function search($params)
{


    $this->load($params);

    $sql = "SELECT deposito_sondagem.*
                  FROM
                      deposito_sondagem,
                      `bd_sisarc`.`tbempresasondagem`
                  WHERE
                      `bd_sisarc`.`tbempresasondagem`.`idEmpSondagem`=`deposito_sondagem`.`entidade_deposito`

                      and deposito_sondagem.estado=1
                      and tbempresasondagem.estado=1
                      and numero_registo LIKE '%$this->numero_registo%'
                      and nomeempsondagem LIKE '%$this->nomeEntidade%'
                      and dono_sondagem LIKE '%$this->dono_sondagem%'
                      and data_deposito LIKE '%$this->data_deposito%'";


    $query = DepositoSondagem::findBySql($sql);
    $dataProvider = new ActiveDataProvider([
        'query' => $query,
    ]);


    if (!$this->validate()) {
        // uncomment the following line if you do not want to return any records when validation fails
        // $query->where('0=1');
        return $dataProvider;
    }


    return $dataProvider;
}

【讨论】:

    【解决方案2】:

    试试这个

    SELECT `users`.* FROM `users` LEFT JOIN `db2name`.`countries` ON `users`.`country_code` = `db2name`.`countries`.`code `
    

    【讨论】:

    • 他在问如何创建模型,你在告诉他如何查询数据。
    猜你喜欢
    • 2016-10-03
    • 2013-11-19
    • 2017-02-20
    • 1970-01-01
    • 2021-06-08
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 2016-08-02
    相关资源
    最近更新 更多