programing

다중 데이터베이스 연결 및 Yii 2.0

nasanasas 2021. 1. 6. 08:25
반응형

다중 데이터베이스 연결 및 Yii 2.0


두 개의 데이터베이스가 있고 모든 데이터베이스에는 동일한 필드가있는 동일한 테이블이 있지만 Yii 2.0 에서 두 데이터베이스의 모든 레코드를 동시에 가져 오려면 어떻게해야 합니까?


먼저 아래와 같이 데이터베이스를 구성해야합니다.

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()

활성 레코드 모델을 사용하는 경우 모델에서 다음을 정의 할 수 있습니다.

public static function getDb() {
    return Yii::$app->db1;
}

//Or db2
public static function getDb() {
    return Yii::$app->db2;
}

그때:

당신이 설정 한 경우 db1에서 getDb()방법, 결과에서 가져온 것 db1등등.

ModelName::find()->select('*')->all();

추가하기 위해 : 제공된 답변을 따랐지만 여전히 오류가 발생했습니다. "알 수없는 구성 요소 ID : db"

몇 가지 테스트 후 발견 한 내용은 다음과 같습니다. getDB 함수는 db에 연결 한 후에 만 호출 됩니다. 따라서 구성 파일에서 'db'를 삭제하거나 이름을 바꿀 수 없습니다. 대신 'db'에 대한 호출이 정상적으로 진행되도록 한 다음 나중에 재정의해야합니다.

해결책은 다음과 같습니다.

에서 config/web.php아래에 두 번째 데이터베이스 구성을 추가 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. db를 찾지 못하면 오류가 발생합니다. db2원하는대로 이름을 지정할 수 있습니다 .

이제 모델에서 다음 코드를 추가합니다.

class ModelNameHere extends \yii\db\ActiveRecord {

   // add the function below:
   public static function getDb() {
       return Yii::$app->get('db2'); // second database
   }

이제 기본 db구성을 재정의합니다 .

다른 사람에게 도움이되기를 바랍니다.

Note: you can include the configuration for db2 in another file but you cannot include it in the db.php file (obviously). Instead, create a file called db2.php and call it as you do db:

'db' => require(__DIR__ . '/db.php'),    
'db2' => require(__DIR__ . '/db2.php'),

Thanks


Our situation is a little more complex, we have a "parent" database which has a table that contains the name of one or more "child" databases. The reason for this is that the Yii project is instantiated for each of our clients, and the number of child databases depends on the client, also the database names are arbitrary (although following a pattern).

So we override \yii\db\ActiveRecord as follows:

class LodgeActiveRecord extends \yii\db\ActiveRecord
{

public static function getDb()
{
    $lodgedb = Yii::$app->params['lodgedb'];
    if(array_key_exists( $lodgedb, Yii::$app->params['dbs'])) {
        return Yii::$app->params['dbs'][ $lodgedb ];
    }
    $connection = new \yii\db\Connection([
        'dsn' => 'mysql:host=localhost;dbname=' . $lodgedb,
        'username' => Yii::$app->params['dbuser'],
        'password' => Yii::$app->params['dbpasswd'],
        'charset' => 'utf8',
    ]);
    $connection->open(); // not sure if this is necessary at this point
    Yii::$app->params['dbs'][ $lodgedb ] = $connection;
    return $connection;
}

}

Before calling any database function, first set Yii::$app->params['lodgedb'] to the name of the database required:

Yii::$app->params['lodgedb'] = $lodge->dbname; // used by LodgeActiveRecord

Your model classes don't change except they extend from LodgeActiveRecord:

class BookingRooms extends \app\models\LodgeActiveRecord


If you're using schmunk42/yii2-giiant to generate model classes, there is a 'modelDb' property which you can set to use a database component other than 'db'.

ReferenceURL : https://stackoverflow.com/questions/27254540/multiple-database-connections-and-yii-2-0

반응형