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
+
0
-

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
+
+1
-

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