Динамически переключиться между базами

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
victorko
Сообщения: 77
Зарегистрирован: 2015.06.09, 08:46

Динамически переключиться между базами

Сообщение victorko » 2015.08.07, 10:25

Добрый день, подскажите в общих чертах - как можно реализовать динамическое переключение между базами в зависимости от подключенного пользователя.
т.е. если залогинился пользователь User1 то подключиться к DB1, если User2 то к DB2.
Спасибо.

Onotole
Сообщения: 1808
Зарегистрирован: 2012.12.24, 12:49

Re: Динамически переключиться между базами

Сообщение Onotole » 2015.08.07, 10:31

Создать компонент приложения db2

victorko
Сообщения: 77
Зарегистрирован: 2015.06.09, 08:46

Re: Динамически переключиться между базами

Сообщение victorko » 2015.08.07, 10:33

@Onotole
не совсем понял, а можно ссылку или немного подробнее ?

Аватара пользователя
vitalik1183
Сообщения: 1673
Зарегистрирован: 2014.07.01, 08:42

Re: Динамически переключиться между базами

Сообщение vitalik1183 » 2015.08.07, 10:35

Откройте конфигурацию, там добавлен компонент db
Добавьте компонент db2 и пропишите свои данные.
Yii2!

victorko
Сообщения: 77
Зарегистрирован: 2015.06.09, 08:46

Re: Динамически переключиться между базами

Сообщение victorko » 2015.08.07, 10:42

не правильно объяснил,
как программно создать коннект к базе ?

Onotole
Сообщения: 1808
Зарегистрирован: 2012.12.24, 12:49

Re: Динамически переключиться между базами

Сообщение Onotole » 2015.08.07, 11:02

configs/web.php

Код: Выделить всё

$config = [
    ...
    'components' => [
        ...
        'db' => [
            'class' => 'yii\db\Connection',
            'dsn' => 'mysql:host=localhost;dbname=db1_name',
            'username' => 'db_user',
            'password' => 'db_password',
       ],
       'db2' => [
            'class' => 'yii\db\Connection',
            'dsn' => 'mysql:host=localhost;dbname=db2_name',
            'username' => 'db_user',
            'password' => 'db_password',
       ],
]
Model

Код: Выделить всё

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


Аватара пользователя
warwar.dp
Сообщения: 4
Зарегистрирован: 2014.07.04, 11:33

Re: Динамически переключиться между базами

Сообщение warwar.dp » 2016.08.25, 16:07

А как быть, если баз много, и конкретное их количество не известно? (Например, данные пользователя лежать в отдельной базе для каждого пользователя).

Код: Выделить всё

$users = User::find()->all();
foreach($users as $user) {
  //тут надо подключиться/пере-подключиться к пользовательской базе
  $user_log = new UserDbLogTable();
  ...
  $user_log->save();
}
 
main_db.users - табличка пользователей
userdb_{$user->id}.log - лог пользователя в базе данных userdb_1 для пользователя 1 и тд.
Последний раз редактировалось warwar.dp 2016.08.25, 17:41, всего редактировалось 2 раза.

Аватара пользователя
SiZE
Сообщения: 2699
Зарегистрирован: 2011.09.21, 12:39
Откуда: Perm
Контактная информация:

Re: Динамически переключиться между базами

Сообщение SiZE » 2016.08.25, 16:37

warwar.dp писал(а):А как быть, если баз много, и конкретное их количество не известно?

Код: Выделить всё

$connection = Yii::createObject([
            'class' => 'yii\db\Connection',
            'dsn' => 'mysql:host=localhost;dbname=testdb',
            'username' => 'demo',
            'password' => 'demo',
]);
в поиске работы

Аватара пользователя
warwar.dp
Сообщения: 4
Зарегистрирован: 2014.07.04, 11:33

Re: Динамически переключиться между базами

Сообщение warwar.dp » 2016.08.25, 17:42

SiZE писал(а):
warwar.dp писал(а):А как быть, если баз много, и конкретное их количество не известно?

Код: Выделить всё

$connection = Yii::createObject([
            'class' => 'yii\db\Connection',
            'dsn' => 'mysql:host=localhost;dbname=testdb',
            'username' => 'demo',
            'password' => 'demo',
]); 
Не совсем понятно, как делать подключение и отключение для баз данных?
ps. Пользователей много, намного больше, чем разрешенное количество подключений к серверу БД.
ps2. Некоторые таблички логов могут находиться на других серверах БД.

Аватара пользователя
SiZE
Сообщения: 2699
Зарегистрирован: 2011.09.21, 12:39
Откуда: Perm
Контактная информация:

Re: Динамически переключиться между базами

Сообщение SiZE » 2016.08.25, 21:12

warwar.dp писал(а):Не совсем понятно, как делать подключение и отключение для баз данных?
ps. Пользователей много, намного больше, чем разрешенное количество подключений к серверу БД.
ps2. Некоторые таблички логов могут находиться на других серверах БД.
Это уже не вписывается в эту тему.
в поиске работы

Аватара пользователя
ElisDN
Сообщения: 5467
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Динамически переключиться между базами

Сообщение ElisDN » 2016.08.25, 21:49

warwar.dp писал(а):ps. Пользователей много, намного больше, чем разрешенное количество подключений к серверу БД.
Может статью про это напишу.
Последний раз редактировалось ElisDN 2016.11.09, 15:26, всего редактировалось 1 раз.

Аватара пользователя
warwar.dp
Сообщения: 4
Зарегистрирован: 2014.07.04, 11:33

Re: Динамически переключиться между базами

Сообщение warwar.dp » 2016.08.26, 10:15

SiZE писал(а):
warwar.dp писал(а):Не совсем понятно, как делать подключение и отключение для баз данных?
ps. Пользователей много, намного больше, чем разрешенное количество подключений к серверу БД.
ps2. Некоторые таблички логов могут находиться на других серверах БД.
Это уже не вписывается в эту тему.
Как раз тема динамического переключения между базами не раскрыта.

Аватара пользователя
SiZE
Сообщения: 2699
Зарегистрирован: 2011.09.21, 12:39
Откуда: Perm
Контактная информация:

Re: Динамически переключиться между базами

Сообщение SiZE » 2016.08.26, 10:22

warwar.dp писал(а):Как раз тема динамического переключения между базами не раскрыта.

Код: Выделить всё

    private $db;
    
    public static function dbList()
    {
        return [
            'db1' => [
                'class' => 'yii\db\Connection',
                'dsn' => 'mysql:host=localhost;dbname=testdb',
                'username' => 'demo',
                'password' => 'demo',
            ],
            'dbN' => [/*...*/]
        ];
    }
    
    public function db($dbName)
    {
        if (empty($this->db[$dbName]) {
            $list = static::dbList();
            $this->db[$dbName] = Yii::createObject($list[$dbName]);
        }
        
        return $this->db[$dbName];
    }
в поиске работы

Ответить