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