RedBeanPHP un ORM fácil de programar en PHP

Un ORM ( Object-Relational mapping ) o Mapeo objeto-relacional son unas clases usadas en los lenguajes orientados a objetos para controlar las bases de datos en el mejor de los casos con cero conocimiento SQL y en el peor de los casos teniendo que usar algo de SQL para subsanar las limitantes que pudiera tener el ORM

Ventajas

Al no escribirse código SQL en ninguna parte no hay donde hacer una inyección SQL , muchos de los sitios que son hackeados por inyecciones SQL no lo serian si tuvieran un ORM

Puede migrarse de una DB a otra que este soportada por el ORM y el código en el programa no cambia, esto significa que no tienes que preocuparte si te dicen que debes entregar tu proyecto en ORACLE, SQL SERVER, MySQL, SQLite, etc. El mismo código es válido para todas las bases de datos, siempre y cuando el ORM soporte esas bases de datos.

Desventaja

Mientras más se le facilita la vida al programador, más recursos usa. Esto significa que es un poco más lento obtener los datos de una base de datos vía ORM que con SQL nativo, la mayoría de las veces esta desventaja queda justificada con la facilidad y la seguridad que proporciona un ORM

Hay muchos ORM la mayoría son usados en frameworks como PHP con Laravel, Python con Django o en el caso de .NET C# que cuenta con ORMs como NHibernate o EntityFramework

El problema es que para usar un ORM te tienes que bajar todo un framework ya que los framework traen ORM incorporados como “ventaja” y a veces solo quieres un ORM para cuando la situación lo necesita sin tener que programar en las reglas del framework

Para PHP existen varios ORM pero hoy me centrare en RedBean es un sencillo ORM, incluso tal vez demasiado sencillo ya que el mapeo de las clases se hace al mismo tiempo ahorrando muchas líneas de código.

RedBean lo hace todo por el programador.

Crea el esquema de tablas, creas las columnas y decide qué tipo es el más adecuado incluso en tiempo de desarrollo es capaz de evolucionar las columnas, si una columna inicia como int por que el primer valor almacenado es 20 y en el siguiente registro se le escribe veinte con letras, este ORM exporta el 20 a texto y cambia el tipo de la columna a varchar de forma transparente, por supuesto una vez en producción esa capacidad de cambiar cosas al vuelo se puede bloquear para que no haya cambios de tipos.

Como usar RedBean

En RedBeans los registros se llaman beans por lo que si en la documentación lees beans en realidad se está refiriendo a un registro almacenado en una tabla. Para facilitar a mis lectores como adoptar este ORM haré una comparación de lenguaje SQL a las clases de PHP de RedBean que hacen exactamente el mismo movimiento.

Mapear

Significa que una clase con sus propiedades son traducidas por el ORM a la base de datos y a sus tipos para el esquema de las tablas, en varios ORM esto se hace en 2 pasos, se escribe una clase con sus propiedades y luego se mapea a la base de datos con otra clase que hereda de la primera en RedBean la clase y el mapeo se hacen en una sola clase todo controlado por RedBean ahorrando tener que escribir una de las clases que si es requerida en otros ORM

Conexión a la base de datos, aquí usare MySQL en PHP nativo con PDO

Con PHP PDO

$con = new PDO('mysql:host=localhost;dbname=dragon, usuario, clave);
$con->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

Con RedBean

require "rb.php";
$db = new R();
$db->setup("mysql:host=localhost;dbname=rb","usuaro","clave");

Crear tablas

Todas las tablas en los ORM tienen algo en común, siempre traen la columna id como llave primaria ya que es la guía de todo ORM, en el caso de RedBean si la tabla no existe la crea y si existe la mapea

Con SQL

create table perfil (id int not null auto_increment primary key);

con RedBean

$perfil = $db->dispense("perfil");

$perfil en este momento es una clase mapeada de la tabla perfil, si la tabla perfil tenia columnas o campos estos ya se encuentran disponibles para usarse en $perfil de lo contrario $perfil solo contiene la columna id que todo ORM requiere, al momento de escribirle nuevas propiedades a la clase $perfil estas se crearan automáticamente y RedBean escribirá el tipo que en su lógica crea más conveniente, por ejemplo

$perfil->nombre = “Pedro”;

Esto creara una columna en la tabla perfil si no existe llamada nombre y como el valor pedro se le asigno es de tipo string entonces el tipo de la columna será varchar otro ejemplo seria $perfil->edad = 20 , aquí se crearía una columna llamada edad del tipo int

Creando el esquema de la base de datos

En el párrafo anterior describí como se van creando los tipos en el esquema de la base de datos según la propiedad de la clase en PHP, ahora un ejemplo mas detallado comparándolo con SQL

Con SQL

alter table perfil ADD (nombre varchar(200), numero int);
insert into perfil (nombre,numero) values ("Last Dragon",5554449990);

Con RedBean

$perfil->nombre = "Last Dragon";
$agenda->numero = 5554449990;
$db->store($perfil);

Traer un registro o bean y de ser necesario actualizarlo.

En RedBean como en otros ORM el eje es el ID por lo que se tiene que conocer el ID del registro que se quiere recuperar, si no se conoce entonces se tiene que buscar con otros métodos como find

Con SQL

select * from perfil where id = 1;

Con RedBean

$perfil = $db->load(“perfil”,1);

$perfil es una clase mapeada con los valores del bean o registro del ID 1 que ya puede ser mostrados, por ejemplo

echo $perfil->nombre;

en RedBean no existe un método update, el store sirve para insertar nuevos registros o para actualizarlos, por ejemplo cuando en encuentra que hay una propiedad id con el valor 1 , store sabe que si es llamado lo que se requiere es actualizar lo valores en en registro con valor ID 1 en la DB según las que propiedades que tenga la clase.

Actualizar el número es tan simple como asignarle otro valor

$perfil->numero = 999910293;
$db->store ($perfil);

Esto equivale en SQL a:

update perfil set numero=999910293 where id = 1;

Borrar un registro o bean

En RedBean como siempre el eje es el valor ID y el registro borrado es el que ID tenga como valor

En SQL

delete from perfil where id = 1;

En RedBean

$perfil = $db->load(“perfil”,1);
$db->trash($perfil);

Buscar el Bean o registro para obtener su ID

En SQL

select * from perfil where nombre = 'Last Dragon' LIMIT 1;

En RedBean

$db->findOne( “perfil”, “ nombre = ? “, [ “Last Dragon” ] );

Los ejemplos anteriores solo trae la primera coincidencia de un nombre con valor Last Dragon, si hay mas registros con el valor de Last Dragon se va a ignorar, si se requiere encontrar todos los registros y buscar por código en PHP

En SQL

select * from perfil;

En RedBean

$perfil = findAll( “perfil” );

Ahora $perfil tiene un arreglo con todos los registros de la tabla perfil se puede ir buscando uno por uno con un foreach , ejemplo.

Foreach ($perfil as $registro)
{
Echo $registro[“nombre”];
Código;código;código;
}

Métodos muy usados en tiempo de desarrollo

$db->freeze(false);

Mientras esta en falso permite que el ORM cambie el esquema de las tablas a voluntad, metiendo mas columnas o cambiando el tipo de las mismas, cuando esta en TRUE ya no permite ningún cambio en el esquema de la tabla, TRUE es para producción.

$db->nuke();

Nuke destruye toda la DB, cuando se está en desarrollo se usa para reiniciar a 0 tanto los datos como las tablas, nuke destruye todo sin miramiento, cuidado al invocarlo.

Para mas información sobre este ORM en su sitio WEB http://www.redbeanphp.com/ ahí se encuentra mas documentación y otros ejemplos de uso.

A continuación un video que demuestra el funcionamiento de RedBeans con 2 tablas relacionadas con llaves foreaneas, ojo en el video solo guardo una tabla, No te confundas, esto es por que están relacionadas en esta línea de código $agenda->perfil = $perfil; la cual crea una llave foránea, como agenda depende de perfil el ORM se da cuenta y entiende que debe guardar también perfil, de hecho se guarda primero perfil, los ORM son tecnologías muy inteligentes que rara vez fallan en su lógica para realizar las funciones de guardado.

Notaras que no hay una sola línea de código SQL en este código y aun así se crea tabla con su esquema correcto y se almacena un valor en ella.

Código del vídeo

<?php

require "rb.php";
$db = new R();
$db->setup("mysql:host=localhost;dbname=rb","root","");
$db->freeze(false);
// $db->nuke();
$perfil = $db->dispense("perfil");
$agenda = $db->dispense("agenda");

$perfil->nombre = "Last Dragon";

$agenda->numero = 5554449990;
$agenda->correo = "daniel@lastdragon.net";
$agenda->nacimiento = "1995-06-10";
$agenda->perfil = $perfil;

$db->store($agenda);

$agenda = $db->load("agenda",1);
$perfil = $db->load("perfil",$agenda->perfil_id);

echo $perfil->nombre;

?>

2 Comments

Add a Comment

Comment spam protected by SpamBam