Zend Framework egyszerre több adatbázis használata – Zend_Db_Table_Abstract objektummal

Egy nagyobb portál építésén dolgozunk jelenleg. Egy meglévő adatbázis felhasználásával kell ezt elkészítenünk, viszont az adatbázisban redundáns adattárolás és átgondolatlan kialakítás a jellemző. Úgy döntöttünk, hogy gyökeresen kezeljük a problémát, egy új adatbázist építünk, mivel jelenleg még nem tartalmaz  túlságosan kezelhetetlen nagy adatmennyiséget, viszont ha ez ebben a formában marad, akkor  kontrollálhatatlanná válik.

A probléma adatok átemelése a régi adatbázisból az újba. Többféle megoldás is létezik erre, egyesével átgépeljük :D, csv, xls export improt, ugyanez XML-el, de  a legkézenfekvőbb egy automatizmus elkészítése az adattisztítás, leválogatás, adatátemelésre. Erre jó egy egyszerűbb adatfeldolgozó tisztító Zend-es alkalmazás elkészítése, tényleg egyszerű, ne gondoljunk semmi agyafúrt hatalmas rendszerre.

A fenti megoldási terv magában foglalja több adatbázissal való kapcsolat létesítését, és adatok mozgatását. Mivel gyors megoldásra volt szükségünk, megtaláltam Jeroen Keppens egy írását ezzel a témával kapcsolatban a “blogján”. A Different User / Host megoldást használtam.  A példában amit ecsetel két adatbázisban lévő egy-egy adatbázistáblának a JOIN megoldását mutatja be Zend_Db_Table_Abstract objektum segítségével.

Gondoltam én is használom a megoldást, viszont nekem nem egy JOIN-os SELECT-es megoldásra volt szükségem, hanem egy SELECT majd INSERT INTO  a másik adatbázisba, ill sok INSERT INTO 😛

Az utasításoknak megfelelően elkészítettem a kódomat, a baj annyi volt, hogy miután az eredeti adatbázis volt beállítva Defaultnak, az új adatbázisba történő beillesztéskor hiába adtam meg új sémát, adaptert  és táblanevet az Objektumomnak, nem volt hajlandó azt használni.

Ezután kis utánajárással, megtaláltam a megoldást, el kell készíteni egy  protected function _setupDatabaseAdapter() függvényt, amellyel be tudjuk állítani az új adatbázis kapcsolatot:

protected function _setupDatabaseAdapter()
{
$mydb = Zend_Registry::get('db_remote');
$this->_setAdapter($mydb);
}

Azt gondoltam igen működik, de sajnos még így se jó, ennek pedig azaz oka újabb 3-4 óra keresgélés után, hogy a setupDatabaseAdapter() metódus esetén(“Hála az öröklődésnek”) csak, akkor épül fel az új adatbázis kapcsolat, ha jelenleg nincs adatbázis kiválasztva. Tehát amikor lekérdeztem az adatokat a régi adatbázisból, hiába adom meg az új adatbázis elérhetőségét, egy másik Zend_Db_Table_Abstarct-ból örököltetett Objektumom esetében, mivel már van egy adatbázis kapcsolat nem fog felépülni az új, és a régit akarja használni a beszúrásnál is, ami ugye azért rossz, mert a régi adatbázis az nem az új, ez is egy szép magyar mondat volt :D.

A megoldás? Egyszerű, ha átrágtad magad mindenen, létezik egy protected változó még az protected _adapter, protected _shema, és protected _name-en kívül ez pedig a protected _db, így nem kell mást tenni mint:

protected _db = “”;

üresre állítani,  ebben az esetben a Zend azt érzékeli, hogy nincs adatbázis kapcsolatunk, így fel kell építenie és ebben az esetben már hajlandó az új adatbázishoz is kapcsolódni. Így a Zend_Db_Table_Abstract Objektumból örököltetett, adatbázis táblánkat megvalósító objektum kb. így néz ki:

<?php
class Mymodel extends Zend_Db_Table_Abstract
{
protected $_name = 'table_name';
protected $_shema = 'database_name';
protected $_db = '';

protected function _setupDatabaseAdapter()
{
$mydb = Zend_Registry::get('db_remote');
$this->_setAdapter($mydb);
}
.....
?>

Illetve Bootstrap.php objektumunkban  a következő tagfüggvényt építjük be:

<?php
public function _initDbRegistry()
{
$this->bootstrap('multidb');
$multidb = $this->getPluginResource('multidb');
Zend_Registry::set('db_local', $multidb->getDb('local'));
Zend_Registry::set('db_remote', $multidb->getDb('remote'));
}
?>

application.ini-ben pedig megadjuk az adatbázis kapcsolódási adatokat, ahogy azt Jeroen Keppens is tette.

Advertisements

Vélemény, hozzászólás?

Adatok megadása vagy bejelentkezés valamelyik ikonnal:

WordPress.com Logo

Hozzászólhat a WordPress.com felhasználói fiók használatával. Kilépés / Módosítás )

Twitter kép

Hozzászólhat a Twitter felhasználói fiók használatával. Kilépés / Módosítás )

Facebook kép

Hozzászólhat a Facebook felhasználói fiók használatával. Kilépés / Módosítás )

Google+ kép

Hozzászólhat a Google+ felhasználói fiók használatával. Kilépés / Módosítás )

Kapcsolódás: %s