Zend Framework/Zend Db/Zend Db Adapter
Nota
[editar]Esta parte esta en desarrollo, falta pulir una version final. Pero a fines pragmaticos es adecuada
Problema/Escenario
[editar]Diferentes motores de base de datos.
El origen de datos es diverso y puede cambiar con frecuencia. COMPLETAR !!!
Solución
[editar]Una capa de abstracción de datos (DAO - Data Access Object) que permita independizar el acceso al origen de datos. Es decir si hoy uso MySql poder migrar hacia Oracle sin mayores dificultades.
Actualmente Zend_Db soporta las siguientes base de datos.
- DB2 and Informix Dynamic Server (IDS)
- MySQL
- Microsoft SQL Server
- Oracle
- PostgreSQL
- SQLite
Ejemplos
[editar]Utilizando la estructura básica !!!Anexar url hacia la estructura básica
Vamos a utilizar las base de datos que trae de ejemplo MySql world
Conectándose a una base de datos utilizando el Adapter
[editar]En este ejemplo nos conectaremos hacia una base de datos MySql utilizando la extensión PHP PDO_MySql.
html/index.php
<?php // Incluimos las clases necesarias para la conexión require_once 'Zend/Db.php'; require_once 'Zend/Db/Table/Abstract.php'; try { // Seteos para la conexión con la base de datos $db = Zend_Db::factory('Pdo_Mysql', array( 'host' => 'localhost', 'username' => 'root', 'password' => '', 'dbname' => 'world' )); //Test de conexión con la base de datos $db->getConnection(); } catch (Zend_Db_Adapter_Exception $e) { //Sucedió un error con las credenciales del usuario o la base de datos. die($e->getMessage()); } catch (Zend_Exception $e) { // Sucedió un error inexperado die($e->getMessage()); } ?>
Ejecutar consultas SQL directamente utilizando el Adapter
[editar]Ahora utilizaremos el Adapter como un medio de ejecutar consultas a la base de datos. Estos casos son recomendables cuando la lógica de la consulta o las implementaciones de la misma requieren un uso no estandar de sentencias.
Supongamos que estamos trabajando en forma local y en nuestra carpeta de servidor sea www o htdocs, entonces la llamada sería algo del estilo
http://localhost/zfTutorial/html/index/listado
Seleccionar
[editar]html/index.php
[editar]<?php //Optimizamos las cargas de las clases bajo demanda require_once 'Zend/Loader.php'; Zend_Loader::registerAutoload(); try { // Seteos para la conexión con la base de datos $db = Zend_Db::factory('Pdo_Mysql', array( 'host' => 'localhost', 'username' => 'root', 'password' => '', 'dbname' => 'world' )); //Test de conexión con la base de datos $db->getConnection(); // Establecemos que $db será el Adapter por defecto Zend_Db_Table_Abstract::setDefaultAdapter($db); } catch (Zend_Db_Adapter_Exception $e) { //Sucedió un error con las credenciales del usuario o la base de datos. die($e->getMessage()); } catch (Zend_Exception $e) { // Sucedió un error inexperado die($e->getMessage()); } // Iniciamos el MVC $dir = realpath(dirname(__FILE__).'/../application/controllers'); Zend_Controller_Front::run($dir); ?>
application/controllers/IndexController.php
[editar]<?php class IndexController extends Zend_Controller_Action { // Listaremos las primeras 10 ciudades public function listadoAction(){ $db = Zend_Db_Table_Abstract::getDefaultAdapter(); $db->setFetchMode(Zend_Db::FETCH_OBJ); $sql = 'SELECT * FROM City limit 0,10'; $this->view->ciudades = $db->fetchAll($sql,Zend_Db::FETCH_BOTH); } } ?>
application/views/scripts/index/listado.phtml
[editar]<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>ZFT :: Zend_Db_Adapter</title> </head> <body> <table border="1"> <tr> <th>ID</th> <th>Name</th> <th>CountryCode</th> <th>District</th> <th>Population</th> </tr> <?php foreach ($this->ciudades as $ciudad) {?> <tr> <td><?=$ciudad->ID?></td> <td><?=$ciudad->Name?></td> <td><?=$ciudad->CountryCode?></td> <td><?=$ciudad->District?></td> <td><?=$ciudad->Population?></td> </tr> <?php }?> </table> </body> </html>
ABM utilizando el Adapter
[editar]Aquí mostraré el ejemplo solo hasta la parte de consulta, la vista no tiene relevancia
Alta
[editar]http://localhost/zfTutorial/html/index/alta
html/index.php
[editar]<?php //Optimizamos las cargas de las clases bajo demanda require_once 'Zend/Loader.php'; Zend_Loader::registerAutoload(); try { // Seteos para la conexión con la base de datos $db = Zend_Db::factory('Pdo_Mysql', array( 'host' => 'localhost', 'username' => 'root', 'password' => '', 'dbname' => 'world' )); //Test de conexión con la base de datos $db->getConnection(); // Establecemos que $db será el Adapter por defecto Zend_Db_Table_Abstract::setDefaultAdapter($db); } catch (Zend_Db_Adapter_Exception $e) { //Sucedió un error con las credenciales del usuario o la base de datos. die($e->getMessage()); } catch (Zend_Exception $e) { // Sucedió un error inexperado die($e->getMessage()); } // Iniciamos el MVC $dir = realpath(dirname(__FILE__).'/../application/controllers'); Zend_Controller_Front::run($dir); ?>
application/controllers/IndexController.php
[editar]<?php class IndexController extends Zend_Controller_Action { public function altaAction(){ $db = Zend_Db_Table_Abstract::getDefaultAdapter(); $data = array( 'Name' => 'Capitan Bermudez', 'CountryCode' => 'ARG', 'District' => 'Santa Fe', 'Population' => '1266461' ); $db->insert('City', $data); } // Listaremos las primeras 10 ciudades public function listadoAction(){ $db = Zend_Db_Table_Abstract::getDefaultAdapter(); $db->setFetchMode(Zend_Db::FETCH_OBJ); $sql = 'SELECT * FROM City limit 0,10'; $this->view->ciudades = $db->fetchAll($sql,Zend_Db::FETCH_BOTH); } } ?>
application/views/scripts/index/alta.phtml
[editar]<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>ZFT :: Zend_Db_Adapter</title> </head> <body> <h1>Se guardo una nueva ciudad</h1> </body> </html>
Baja
[editar]http://localhost/zfTutorial/html/index/baja
html/index.php
[editar]<?php //Optimizamos las cargas de las clases bajo demanda require_once 'Zend/Loader.php'; Zend_Loader::registerAutoload(); try { // Seteos para la conexión con la base de datos $db = Zend_Db::factory('Pdo_Mysql', array( 'host' => 'localhost', 'username' => 'root', 'password' => '', 'dbname' => 'world' )); //Test de conexión con la base de datos $db->getConnection(); // Establecemos que $db será el Adapter por defecto Zend_Db_Table_Abstract::setDefaultAdapter($db); } catch (Zend_Db_Adapter_Exception $e) { //Sucedió un error con las credenciales del usuario o la base de datos. die($e->getMessage()); } catch (Zend_Exception $e) { // Sucedió un error inexperado die($e->getMessage()); } // Iniciamos el MVC $dir = realpath(dirname(__FILE__).'/../application/controllers'); Zend_Controller_Front::run($dir); ?>
application/controllers/IndexController.php
[editar]<?php class IndexController extends Zend_Controller_Action { public function altaAction(){ $db = Zend_Db_Table_Abstract::getDefaultAdapter(); $data = array( 'Name' => 'Capitan Bermudez', 'CountryCode' => 'ARG', 'District' => 'Santa Fe', 'Population' => '1266461' ); $db->insert('City', $data); } public function bajaAction(){ $db = Zend_Db_Table_Abstract::getDefaultAdapter(); $this->view->resultado = $db->delete('City', 'ID = 5000'); } // Listaremos las primeras 10 ciudades public function listadoAction(){ $db = Zend_Db_Table_Abstract::getDefaultAdapter(); $db->setFetchMode(Zend_Db::FETCH_OBJ); $sql = 'SELECT * FROM City limit 0,10'; $this->view->ciudades = $db->fetchAll($sql,Zend_Db::FETCH_BOTH); } } ?>
application/views/scripts/index/baja.phtml
[editar]<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>ZFT :: Zend_Db_Adapter</title> </head> <body> <h1>Se elimino una ciudad</h1> </body> </html>
Modificación
[editar]html/index.php
[editar]<?php //Optimizamos las cargas de las clases bajo demanda require_once 'Zend/Loader.php'; Zend_Loader::registerAutoload(); try { // Seteos para la conexion con la base de datos $db = Zend_Db::factory('Pdo_Mysql', array( 'host' => 'localhost', 'username' => 'root', 'password' => '', 'dbname' => 'world' )); //Test de conexion con la base de datos $db->getConnection(); // Establecemos que $db sera el Adapter por defecto Zend_Db_Table_Abstract::setDefaultAdapter($db); } catch (Zend_Db_Adapter_Exception $e) { //Sucedio un error con las credenciales del usuario o la base de datos. die($e->getMessage()); } catch (Zend_Exception $e) { // Sucedio un error inexperado die($e->getMessage()); } // Iniciamos el MVC $dir = realpath(dirname(__FILE__).'/../application/controllers'); Zend_Controller_Front::run($dir); ?>
application/controllers/IndexController.php
[editar]<?php class IndexController extends Zend_Controller_Action { public function altaAction(){ $db = Zend_Db_Table_Abstract::getDefaultAdapter(); $data = array( 'Name' => 'Capitan Bermudez', 'CountryCode' => 'ARG', 'District' => 'Santa Fe', 'Population' => '1266461' ); $db->insert('City', $data); } public function bajaAction(){ $db = Zend_Db_Table_Abstract::getDefaultAdapter(); $this->view->resultado = $db->delete('City', 'ID = 5000'); } public function modificacionAction(){ $db = Zend_Db_Table_Abstract::getDefaultAdapter(); $data = array( 'Name' => 'Capitan Bermudez cambio', 'CountryCode' => 'ARG', 'District' => 'Santa Fe', 'Population' => '1266461' ); $db->update('City', $data, 'ID = 4081'); } // Listaremos las primeras 10 ciudades public function listadoAction(){ $db = Zend_Db_Table_Abstract::getDefaultAdapter(); $db->setFetchMode(Zend_Db::FETCH_OBJ); $sql = 'SELECT * FROM City limit 0,10'; $this->view->ciudades = $db->fetchAll($sql,Zend_Db::FETCH_BOTH); } } ?>
application/views/scripts/index/modificacion.phtml
[editar]<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>ZFT :: Zend_Db_Adapter</title> </head> <body> <h1>Se modifico una ciudad</h1> </body> </html>
Bibliografía
[editar]http://framework.zend.com/manual/en/zend.db.html
http://java.sun.com/blueprints/corej2eepatterns/Patterns/DataAccessObject.html