Foros del Web » Programando para Internet » PHP » Zend »

Trabajar con 2 bases de dato en ZF

Estas en el tema de Trabajar con 2 bases de dato en ZF en el foro de Zend en Foros del Web. Hola amigos, de vuelta por acá. Estoy trabajando con una aplicación ZF y debo utilizar 2 bases de datos, estoy siguiendo el manual pero hay ...
  #1 (permalink)  
Antiguo 21/03/2011, 10:09
pur
 
Fecha de Ingreso: agosto-2007
Mensajes: 98
Antigüedad: 16 años, 7 meses
Puntos: 4
Trabajar con 2 bases de dato en ZF

Hola amigos, de vuelta por acá.
Estoy trabajando con una aplicación ZF y debo utilizar 2 bases de datos, estoy siguiendo el manual pero hay algo que no lo tengo claro, explico.

application.ini
Código PHP:
Ver original
  1. ;bases de datos
  2. resources.multidb.db1.adapter = "pdo_mysql"
  3. resources.multidb.db1.host = "localhost"
  4. resources.multidb.db1.username = "d"
  5. resources.multidb.db1.password = "f"
  6. resources.multidb.db1.dbname = "a"
  7.  
  8. resources.multidb.db2.adapter = "pdo_pgsql"
  9. resources.multidb.db2.host = "localhost"
  10. resources.multidb.db2.username = "d"
  11. resources.multidb.db2.password = "f"
  12. resources.multidb.db2.dbname = "b"
  13. resources.multidb.db2.default = true

En el bootstrap registro los adapters:
Código PHP:
Ver original
  1. protected function _initDbAdaptersToRegistry()
  2. {
  3.  
  4.     $this->bootstrap('multidb');
  5.     $resource = $this->getPluginResource('multidb');
  6.     $resource->init();
  7.  
  8.     $Adapter1 = $resource->getDb('db2');
  9.     $Adapter2 = $resource->getDb('db1');
  10.     Zend_Registry::set('Adapter1RegKey', $Adapter1);
  11.     Zend_Registry::set('Adapter2RegKey',$Adapter2);
  12.  
  13. }

Llamada del modelo en el controlador:
Código PHP:
Ver original
  1. $autos = Default_Model_Autos();
  2. $vertodos = $autos->vertodos();



el modelo:
Código PHP:
Ver original
  1. class Default_Model_Autos extends Zend_Db_Table_Abstract
  2. {
  3. protected $_name = 'autos';
  4. protected $_primary = 'id';
  5.  
  6. protected $_coneccion = Zend_Registry::get('Adapter2RegKey');
  7.  
  8. function vertodos(){
  9.  
  10.    $todos = $this->_coneccion->fetchAll();
  11.    return $todos;
  12.  
  13.         }
Si alguien puede ver donde está el error le agradezco.

PD:Me llamó la atención que no utilice Zend_Db::factory(... pero así está en el manual.
  #2 (permalink)  
Antiguo 21/03/2011, 10:15
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Trabajar con 2 bases de dato en ZF

Si quieres cambiar el adaptador que usa un DbTable en específico, debes de cambiarlo usando setAdapter, por ejemplo:
Código PHP:
Ver original
  1. $Adapter2 = Zend_Registry::get('adapter2');
  2. $autos = new Default_Model_Autos(array('db' => $Adapter2));
  3. $vertodos = $autos->vertodos();

Así puedes especificar al crear tu DBTable el adaptador a usar.

Saludos.
  #3 (permalink)  
Antiguo 21/03/2011, 11:22
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 3 meses
Puntos: 845
Respuesta: Trabajar con 2 bases de dato en ZF

O puede redefinir Zend_Db_Table_Abstract::_setupDatabaseAdapter para no tener que estar pasando por parametro el adapter y te comento algo pur tu clase deberia estar bajo el namespace DbTable, deberia ser Default_Model_DbTable_Autos.

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #4 (permalink)  
Antiguo 21/03/2011, 16:45
pur
 
Fecha de Ingreso: agosto-2007
Mensajes: 98
Antigüedad: 16 años, 7 meses
Puntos: 4
Respuesta: Trabajar con 2 bases de dato en ZF

Hola, gracias por las respuestas en caso de redefinir el _setupDatabaseAdapter,este modelo estaría correcto?
Código PHP:
Ver original
  1. class Default_Model_Autos extends Zend_Db_Table_Abstract
  2. {
  3. protected $_name = 'autos';
  4. protected $_primary = 'id';
  5.  
  6.  
  7. protected function _setupDatabaseAdapter()
  8. {
  9. $this->_db = Zend_Registry::get('Adapter2RegKey');
  10. parent::_setupDatabaseAdapter();
  11. }
  12.  
  13.  
  14. function vertodos(){
  15.  
  16.    $todos = $this->fetchAll();
  17.    return $todos;
  18.  
  19.         }
Agradezco las respuestas, saludos.

PD: si agrego el namespace "DbTable", ¿no tengo que cambiar mas nada?... pregunto porque son unas cuantas clases las que habría que modificar, no sea cosa que después no funcione.
  #5 (permalink)  
Antiguo 21/03/2011, 17:29
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 3 meses
Puntos: 845
Respuesta: Trabajar con 2 bases de dato en ZF

Lo probaste ? tal cual esta deberia funcionar, aunque yo agregaria una comprobación minima a través de Zend_Registry::isRegistered, podria ser algo asi:

Código PHP:
Ver original
  1. protected function _setupDatabaseAdapter()
  2. {
  3.     if (!Zend_Registry::isRegistered('Adapter2RegKey')) {
  4.         throw new Zend_Db_Table_Exception(/*****/);
  5.     }
  6.     $this->_db = Zend_Registry::get('Adapter2RegKey');
  7.     parent::_setupDatabaseAdapter();
  8. }

con respecto al namespace, si cambias el nombre tenes que mover el fichero a la carpeta correspontiente y renombrarlo en todos los lugares que lo estes utilizando, multiplicalo por todos los ficheros que sean, si ya lo tenes echo asi, dejalo quieto y tenlo en cuenta para el proximo proyecto.

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #6 (permalink)  
Antiguo 22/03/2011, 19:07
pur
 
Fecha de Ingreso: agosto-2007
Mensajes: 98
Antigüedad: 16 años, 7 meses
Puntos: 4
Respuesta: Trabajar con 2 bases de dato en ZF

Muchas gracias.

Pequeña duda, que ventaja tengo agregando el namespace DbTable?

Porque estoy creando todo con zend tool desde netbeans y me crea los modelos donde ya los tengo (en la carpeta model).
No consigo que los cree dentro de DbTable y no quiero cambiarlos manualmente y que queden diferente a zfproject.xml

Saludos.

PD: de paso pregunto porque quizas lo estoy haciendo mal y alguien sabe...

en el zend comand de Netbeans pongo:
Autos default, y me crea el modelo Autos en el modulo default;

ahora si pongo:
DbTable_Autos default, no me crea nada.

Etiquetas: bases, dato, frameworks-y-php-orientado-a-objetos
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 22:35.