Abstracción de bases de datos para PHP

ORM

Object-Relational mapping, o lo que es lo mismo, mapeo de objeto-relacional, es un modelo de programación que consiste en la transformación de las tablas de una base de datos, en una serie de entidades que simplifiquen las tareas básicas de acceso a los datos para el programador.

Para acceder de forma efectiva a la base de datos desde un contexto orientado a objetos, es necesaria una interfaz que traduzca la lógica de los objetos a la lógica relacional, esta interfaz se llama ORM (object-relational mapping) o “mapeo de objetos a bases de datos”, y está formada por objetos que permiten acceder a los datos y que contienen en sí mismos el código necesario para hacerlo1.

La principal ventaja de la capa de abstracción es la portabilidad, porque hace posible el cambiar la aplicación a otra base de datos, incluso en mitad del desarrollo de un proyecto. Si se debe desarrollar rápidamente un prototipo de una aplicación y el cliente no ha decidido todavía la base de datos que mejor se ajusta a sus necesidades, se puede construir la aplicación utilizando SQLite y cuando el cliente haya tomado la decisión, cambiar fácilmente a MySQL, PostgreSQL u Oracle. Solamente es necesario cambiar una línea en un archivo de configuración y todo funciona correctamente

EJEMPLOS

La utilización de objetos en vez de registros y de clases en vez de tablas, tiene otra ventaja: permite añadir métodos accesores en los objetos que no tienen relación directa con una tabla. Si se dispone por ejemplo de una tabla llamada cliente con dos campos llamados nombre y apellidos, puede que se necesite un dato llamado NombreCompleto que incluya y combine el nombre y los apellidos. En el mundo orientado a objetos, es tan fácil como añadir un método accesor a la clase Cliente, como se muestra en el EJEMPLO 1. Desde el punto de vista de la aplicación, no existen diferencias entre los atributos Nombre, Apellidos, NombreCompleto de la clase Cliente. Solo la propia clase es capaz de determinar si un atributo determinado se corresponde con una columna de la base de datos.

EJEMPLO 1

Los métodos accesores en la clase del modelo permiten ocultar la estructura real de la tabla de la base de datos

 

public function getNombreCompleto()

{

return $this->getNombre().’ ‘.$this->getApellidos();

}

Todo el código repetitivo de acceso a los datos y toda la lógica de negocio de los propios datos se puede almacenar en esos objetos. Imagina que se ha definido la clase CarritoCompra en la que se almacenan Productos (que son objetos). Para obtener el precio total del carrito de la compra antes de realizar el pago, se puede crear un método que encapsula el proceso de cálculo, tal y como se muestra en el EJEMPLO 2.

EJEMPLO 2

Los métodos accesores ocultan la lógica de los datos

public function getTotal()

{

$total = 0;

foreach ($this->getProductos() as $producto)

{

$total += $producto->getPrecio() * $producto->getCantidad();

}

return $total;

}

 UTILIDADES

Existen muchas librerías y herramientas

Doctrine http://www.doctrine-project.org/index.html, el más completo y quizás el más usado por los grandes frameworks y gurus, pero su curva de aprendizaje e implementación es compleja.

Propel  http://propelorm.org/ Le permite acceder a su base de datos utilizando un conjunto de objetos, que proporciona una API sencilla para almacenar y recuperar datos. Fue parte integral del framework Symfony en sus primeras versiones. Es un proyecto en constante actualización.

adodb http://adodb.sourceforge.net/, permite implementar fácilmente una capa de abstracción de base de datos. Actualmente soporta un increíble número de bases de datos, gracias a la maravillosa comunidad ADOdb: MySQL, PostgreSQL, Interbase, Firebird, Informix, Oracle, MS SQL, Foxpro, Access, ADO, Sybase, FrontBase, DB2, SAP DB, SQLite, Netezza, LDAP, y ODBC genérico, ODBTP . El Sybase, Informix, FrontBase y PostgreSQL, Netezza, LDAP, los conductores ODBTP son contribuciones de la comunidad. Fácil de aprender, especialmente si usted tiene experiencia de programación de Windows, ya que utiliza muchas convenciones ADO. Potente apoyo Active Record. ADOdb_Active_Record funciona conectado a múltiples bases de datos. Para mayor información consulte la siguiente documentación: http://phplens.com/adodb/docs-active-record.htm

http://adodb.sourceforge.net/docs-active-record.htm

http://www.lacorona.com.mx/fortiz/adodb/tute-es.htm

Insertar y modificar un registro:

$person = new person();

$person->name_first = ‘Andi’;

$person->name_last  = ‘Gutmans’;

$person->save();

RedBeanPHP http://redbeanphp.com/, es una interfaz fácil de usar sobre la marcha ORM para PHP. Se trata de ‘ zero config ‘, basándose en las convenciones estrictas en su lugar. Veamos el código, así es como lo haces CRUD en RedBeanPHP:

require ‘rb.php’;
R::setup();

$post = R::dispense(‘post’);
$post->text = ‘Hello World’;

$id = R::store($post);       //Create or Update
$post = R::load(‘post’,$id); //Retrieve
R::trash($post);             //Delete

Idiorm http://j4mie.github.io/idiormandparis/    http://paris.readthedocs.org/en/latest/, se trata de una biblioteca ligera ORM y un generador de consultas con fluidez para PHP5 que se construye en la parte superior de PHP PDO. Con él, usted puede olvidarse de escribir el tedioso SQL. Idiorm tiene una biblioteca hermana que se llama Paris, que es una implementación de registro Active.

Idiorm Paris
$user = ORM::for_table(‘user’)->where_equal(‘username’, ‘j4mie’)->find_one();

 

$user->first_name = ‘Jamie’;

$user->save();

 

$tweets = ORM::for_table(‘tweet’)

->select(‘tweet.*’)

->join(‘user’, array(

‘user.id’, ‘=’, ‘tweet.user_id’

))

->where_equal(‘user.username’, ‘j4mie’)

->find_many();

 

foreach ($tweets as $tweet) {

echo $tweet->text;

}

 

class User extends Model {public function tweets() {return $this->has_many(‘Tweet’);

}

}

 

class Tweet extends Model {}

 

$user = Model::factory(‘User’)

->where_equal(‘username’, ‘j4mie’)

->find_one();

$user->first_name = ‘Jamie’;

$user->save();

 

$tweets = $user->tweets()->find_many();

foreach ($tweets as $tweet) {

echo $tweet->text;

}

 ActiveRecord

Active Record es una clase para la administración y funcionamiento de los modelos. Esta clase proporciona la capa objeto-relacional que sigue rigurosamente el estándar ORM (Tablas en Clases, Registros en Objetos, y Campos en Atributos), facilita el entendimiento del código asociado a base de datos y encapsula la lógica específica haciéndola más fácil de usar para nosotros los programadores.

Ventajas del ActiveRecord

Manejo de entidades con objetos de PHP.

Las acciones del CRUD (Insertar, leer, modificar y eliminar) están encapsuladas así que se reduce el código y se hace más fácil de comprender.

Código fácil de entender y mantener

Se reduce el uso de código SQL considerablemente lo que implica cierta independencia del manejador de base de datos que usamos.

PHP Data Objects (PDO)

Es una extensión que provee una capa de abstracción sobre las llamadas a bajo nivel de consultas a DB para PHP 5. Se compone de 3 clases: PDO, que se encarga de las conexiones, PDOStatement, que envuelve consultas y resultados y PDOException, su tipo nativo de excepciones.

Permite acceder a distintas bases de datos utilizando las mismas funciones, lo que facilita la portabilidad. En PHP 5 existen drivers para acceder a las bases de datos más populares (MySQL, Oracle, MS SQL Server, PostgreSQL, SQLite, Firebird, DB2, Informix, etc). Consulta la documentación en esta dirección: http://php.net/manual/es/book.pdo.php

Por motivos de seguridad es aconsejable usar consultas preparadas

2Para evitar ataques de inyección se recomienda el uso de sentencias preparadas, en las que PHP se encarga de “desinfectar” los datos en caso necesario.

Consultas preparadas

El método para efectuar consultas es primero preparar la consulta con PDO->prepare($consulta) y después ejecutarla con PDO->execute(array(parámetros)), que devuelve el resultado de la consulta.

EJEMPLO 3

Hacer consultas Bartolomé Sintes Marco

<?php

$nombre = “Juan”;

try{

$conn = new PDO(‘mysql:host=localhost;dbname=basededatos’, $usuario, $contra);

$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$sql = $conn->prepare(‘SELECT * FROM usuarios WHERE nombre = :Nombre’);

$sql->execute(array(‘Nombre’ => $nombre));

$resultado = $sql->fetchAll();

foreach ($resultado as $row) {

echo $row[“Id”];

}

}catch(PDOException $e){

echo “ERROR: ” . $e->getMessage();

}

?>

EJEMPLO 4

Posted by Gonzalo Ayuso

error_reporting(-1);

$time = microtime(TRUE);

$mem = memory_get_usage();

$dbh = new PDO(‘pgsql:dbname=mydb;host=localhost’, ‘gonzalo’, ‘password’);

$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$dbh->beginTransaction();

$smtp = $dbh->prepare(‘INSERT INTO test.tbl1 (id, field1) values (:ID, :FIELD1)’);

for ($i=0; $i<1000; $i++) {

$smtp->execute(array(‘ID’ => $i, ‘FIELD1’ => “field {$i}”));

}

$dbh->commit();

$stmt = $dbh->prepare(‘SELECT * FROM test.tbl1 limit 10000’);

$stmt->execute();

$i=0;

while ($row = $stmt->fetch()) {

$i++;

}

echo ‘<h1>PDO</h1>’;

echo “<strong>{$i} </strong>”;

print_r(array(‘memory’ => (memory_get_usage() – $mem) / (1024 * 1024), ‘seconds’ => microtime(TRUE) – $time));

$dbh->beginTransaction();

$smtp = $dbh->prepare(‘delete from test.tbl1’);

$smtp->execute();

$dbh->commit();

 

REFERENCIAS

1http://librosweb.es/symfony/capitulo_8/por_que_utilizar_un_orm_y_una_capa_de_abstraccion.html

http://es.wikipedia.org/wiki/PHP_Data_Objects

2“Páginas web con PHP” disponible en http://www.mclibre.org, Autor: Bartolomé Sintes Marco

http://www.databaseskill.com/1347484/

https://docs.google.com/document/d/1YLmp9vMnSzKg2emt3Bx564Tf1CLalShPc98Z8nCoi7s/edit

http://en.wikipedia.org/wiki/List_of_object-relational_mapping_software#PHP

 

  • CakePHP, ORM y el marco para PHP 5, de código abierto (escalares, arrays, objetos); basado en la introspección de base de datos, que se extiende ninguna clase
  • CodeIgniter, marco que incluye una implementación de ActiveRecord
  • Doctrine, ORM código abierto para PHP 5.2.3, 5.3.X. El software libre (MIT)
  • Elocuente, un código abierto (MIT) ActiveRecord ORM del LaravelTambién está disponible como un componente independiente.
  • FuelPHP, ORM y el marco para PHP 5.3, liberado bajo la licencia MIT. Basado en el patrón ActiveRecord.
  • PHPixie, ORM y el marco para PHP 5.3, de código abierto
  • Propel, ORM y consulta-toolkit para PHP 5, inspirado por Apache Torque, el software libre, el MIT
  • Qcodo, ORM y el marco para PHP 5, de código abierto
  • Rocks, ORM código abierto para PHP 5.1 plus, gratuito para uso no comercial, GPL
  • Redbean, capa ORM para PHP 5, crea y mantiene las tablas sobre la marcha, de código abierto, BSD
  • Skipper, herramienta de visualización y un generador de código / esquema para PHP marcos ORM , comercial
  • Torpor, ORM código abierto para PHP 5.1 plus, software libre, MIT, base de datos y sistema operativo agnóstico
  • Yii, ORM y el marco para PHP 5, liberado bajo la licencia BSD. Basado en el patrón ActiveRecord.
  • Zend Framework, marco que incluye una puerta de enlace de datos de tabla y fila de puerta de enlace de datos implementaciones.

http://www.lacorona.com.mx/fortiz/adodb/readme-es.htm

http://www.serkey.com/search/

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s