Zend Framework/Zend Db/Zend Db Adapter

De Wikilibros, la colección de libros de texto de contenido libre.

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