多个数据库连接和Yii 2.0
我有两个数据库,并且每个数据库都有相同的字段相同的表,但是如何在Yii 2.0中同时从两个数据库中的所有数据库中获取所有logging?
首先你需要像下面这样configuration你的数据库:
return [ 'components' => [ 'db1' => [ 'class' => 'yii\db\Connection', 'dsn' => 'mysql:host=localhost;dbname=db1name', //maybe other dbms such as psql,... 'username' => 'db1username', 'password' => 'db1password', ], 'db2' => [ 'class' => 'yii\db\Connection', 'dsn' => 'mysql:host=localhost;dbname=db2name', // Maybe other DBMS such as psql (PostgreSQL),... 'username' => 'db2username', 'password' => 'db2password', ], ], ];
那么你可以简单地:
// To get from db1 Yii::$app->db1->createCommand((new \yii\db\Query)->select('*')->from('tbl_name'))->queryAll() // To get from db2 Yii::$app->db2->createCommand((new \yii\db\Query)->select('*')->from('tbl_name'))->queryAll()
如果您正在使用活动logging模型,则可以在模型中定义:
public function getDb() { return Yii::$app->db1; } //Or db2 public function getDb() { return Yii::$app->db2; }
然后:
如果在getDb()
方法中设置了db1
, getDb()
从db1
获取结果等等。
ModelName::find()->select('*')->all();
只是添加:我跟着提供的答案,但仍然有一个错误:“未知的组件ID:DB”
经过一些testing,这里是我发现:函数getDB只有在连接到数据库后才被调用。 因此,您不能在configuration文件中删除或重命名“db”。 相反,你需要让'db'的调用正常进行,然后覆盖它。
解决scheme(对我来说)如下:
在config/web.php
添加你的第二个数据库configuration如下db
:
'db' => require(__DIR__ . '/db.php'), 'db2' => [ 'class' => 'yii\db\Connection', 'dsn' => 'mysql:host=localhost;dbname=name', 'username' => 'user', 'password' => 'password', 'charset' => 'utf8', 'on afterOpen' => function ($event) { $event->sender->createCommand("SET time_zone = '+00:00'")->execute(); }, ],
不要重命名db
。 未能find数据库将导致错误。 无论你喜欢什么,你都可以命名db2
。
现在在模型中添加下面的代码:
class ModelNameHere extends \yii\db\ActiveRecord { // add the function below: public static function getDb() { return Yii::$app->get('db2'); // second database }
这将会覆盖默认的db
configuration。
我希望能帮助别人。
注意:您可以将db2
的configuration包含在另一个文件中,但不能将其包含在db.php
文件中(很明显)。 相反,创build一个名为db2.php
的文件,并在执行db
调用它:
'db' => require(__DIR__ . '/db.php'), 'db2' => require(__DIR__ . '/db2.php'),
谢谢