Aplikace pracující nad vícero databázemi
- thunderbuff
- Člen | 164
Vytvářím aplikaci, která bude pracovat ve více instancích, každá se svou databází. Všechny instance běží na jednom kódu, pouze se načítá jiný neon soubor (na základě url). Při některých operacích v libovolné z instancí budu potřebovat přístup k databázím ostatních instancí. Jak to efektivně udělat? Viděl bych to na čachry s nenonem, ale neumím v tom chodit. Budu vděčný za každou radu.
Editoval thunderbuff (31. 8. 2012 14:16)
- thunderbuff
- Člen | 164
Touto cestou se pokouším jít. Plyne z toho jeden zádrhel: Je možné nějak automaticky určit, ke které databázi se připojit? V každé instanci mám se mi v indexu definuje konstanta APP_INSTANCE. Lze to nějak využít, nebo musím mín konfigurace jednotlivých instancí natvrdo nastavené na správnou databázi?
- Pipaslot
- Člen | 19
Řešil jsem problém, kdy po přihlášení do systému (ověření ve výchozí databázi) se má vybrat klientská databáze, se kterou pracují moje Modely a téměř veškerý běh aplikace je nad klientskou databází. Vytvořil jsem si abstrkaktní třídu UserDb, která z objektu User, získá název databáze a připojí ji. Poté všechny modely pracující pod databázi uživatele dědí userDb.
<?php
abstract class UserDb extends Nette\Object
{
protected $NetteDb, $NetteUser, $NetteContainer;
// User database connection
protected $db;
// Informace for connection into database
protected $dbName;
function __construct(\Nette\Database\Connection $wedb, \Nette\Security\User $user, \Nette\DI\IContainer $container)
{
$this->NetteDb = $wedb;
$this->NetteUser = $user;
$this->NetteContainer = $container;
$this->dbName = $user->getIdentity()->database;
//Předání řízení databáze uživatelské databázi
if($this->db === null)
{
$this->db = new Nette\Database\Connection(
$container->parameters['database']['driver'].':host='.$container->parameters['database']['host'].';dbname='.$this->dbName,
$container->parameters['database']["user"],
$container->parameters['database']["password"]);
//Přidání databáze do Nette panelu laděnky
$service = new Nette\Database\Diagnostics\ConnectionPanel;
$service->explain = FALSE;
Nette\Diagnostics\Debugger::$bar->addPanel($service);
$this->db->onQuery[] = array($service, 'logQuery');
}
}
...
}
Práce s databází u potomků se pak odehrává nad objektem $this->db
Editoval Pipaslot (15. 9. 2012 22:45)