Připojení k další databázi, dle přihlášeného uživatele
Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
- Marek K.
- Člen | 8
Ahoj,
měl bych dotaz mám aplikaci, která má databáze db_default, db_A, db_B, db_C, db_D, atd..
Databáze db_default je hlavní obsahuje vše co je společné pro všechny ostatní db_A, db_B, atd..
Problém je ten, že dokud se uživatel nepřihlásí tak já nevím s jakou databází bude pracovat (databáze se určuje dle přihlášeného uživatele)
Tedy pokud se zaloguje uživatel A bude tak má databázi db_A, pokud uživatel B tak má db_B atd..
Něco podobného co se řešilo zde https://forum.nette.org/…eni-v-config zkoušel jsem to napodobit, ovšem vrací mi to, že tabulka „xyz“ neexistuje (i když v té DB existuje).
Má někdo nápad jak tohle vyřešit efektivně?
Děkuji
Editoval Marek K. (10. 4. 2017 19:36)
- Marek K.
- Člen | 8
Řešení:
<?php
namespace Model;
use Nette\Database\Connection;
use Nette\Database\Context;
use Nette\Database\Conventions\DiscoveredConventions;
use Nette\Database\Structure;
use Nette\Database\Helpers;
class UserDatabaseContext extends Context{
public function __construct(array $database, \Nette\Security\User $user, \Nette\Caching\IStorage $cacheStorage = NULL)
{
if($user->isLoggedIn()) {
$dbname = $user->getIdentity()->database_name;
$database['dsn'] = str_replace(['dbname=?'], ['dbname=' . $dbname], $database['dsn']);
$connection = new Connection($database['dsn'], $database['user'], $database['password'], $database['options']);
$structure = new Structure($connection, $cacheStorage);
$conventions = new DiscoveredConventions($structure);
Helpers::createDebugPanel($connection, TRUE, 'default');
parent::__construct($connection, $structure, $conventions, $cacheStorage);
}
}
}
Config.local.neon
databaseUser:
dsn: 'mysql:host=localhost;dbname=?'
user: root
password:
options:
lazy: yes
Editoval Marek K. (11. 4. 2017 17:15)