Este artículo pretendía ser muy ambicioso, pero descubrí que mi ambición termina en el momento que había que configurar lo necesario para tener un ORM en PHP, por lo que bajare el perfil.
En la oficina el equipo de desarrollo está trabajando en un software de infraestructura muy complejo y que requiere acceso a bases de datos, este proyecto es interesante por toda la infraestructura sobre la que está montado.
Una de las piezas fundamentales es un ORM de hecho es más que solo el ORM, pero debido a que de hecho el diseño es actualmente un secreto no puedo escribir más al respecto.
¿Por qué se requiere un ORM?
Entre las curiosidades de un ORM es abstraerse completamente de la base de datos, esto significa que es deseable que conozcas de SQL pero no indispensable para programar con un ORM. Por ejemplo insertar un registro en la base de datos SQL seria asi.
insert into persona (nombre,edad) values(‘Soy Batman’,15);
en un ORM, ya finalizado en una clase instanciada sería algo así.
Persona.nombre = “Soy Batman”;
Persona.edad = 15;
Persona.save();
Como se deja ver queda totalmente abstraído del SQL, el ORM se encarga de reconvertir todo a SQL y lo mismo ocurre si queremos obtener algún valor de la base de datos. Esto hace que la programación se acelere de forma exponencial.
Por supuesto llegar a manejar solo clases tiene un costo, la configuración de un ORM puede llegar a ser un gran dolor y más si este se tiene que configurar mediante XML es por eso y muchas otras cosas mas que decidi no hacer el articulo de ORM para PHP, lo cual es altamente recomendable para desarrollos grandes pero demasiado laborioso para hacer pequeños programas WEB
Otra de las características de un ORM es obviar la base de datos, el ORM sabe cómo debe conectar al motor de la base de datos por lo que incluso migrar de una motor a otro es tan simple como configurar unas líneas en el ORM, de eso si tratara este articulo. Pero no con un ORM.
Lo hare con algo que es lo básico sobre lo que un ORM se monta.
En el caso de PHP es PDO porque es PHP Data Objects. Hay uno en cada lenguaje de programación orientado a objetos. En Java su clase equivalente es JDBC ( Java Database Connectivity )
Lo que tienen en común estas clases es que abstraen el motor de la base de datos, solo requieren un driver y el resto de las operaciones se hace igual y aunque tienen algunos métodos que abstraen los ACID no llegan a hacer un mapeo como un ORM, sin embargo abstraen lo suficiente para no tener que aprender un API para cada base de datos,puede ser MySQL, MSSQL, PostgreSQL, SQLite, MS-ACCESS, ETC.
La abstracción es tan efectiva que el programa final podría soportar prácticamente cualquier base de datos siempre y cuando el driver esté presente. Cambiar de motor es tan simple como modificar un línea en todo el código del programa.
Para este artículo hice un ejemplo con el mismo código fuente para MySQL y SQLite, el código es el siguiente.
< ?php //Conectar a la DB con Driver MYSQL Base de datos pdotest, Usuario pdo y clave test try { $con = new PDO('mysql:host=localhost;dbname=pdotest', 'pdo', 'test'); $con->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
catch(PDOException $e)
{
echo ‘Error conectando con la base de datos: ‘ . $e->getMessage();
}//Consultas para recuperar valores
try {
$sql = “select * from persona;”;
$stmt = $con->prepare($sql);
$stmt->execute();while( $datos = $stmt->fetch() )
{
echo $datos[“nombre”]. “
“;
echo $datos[“edad”]. “
“;
}}
catch (PDOException $e)
{
echo ‘Error conectando con la base de datos: ‘ . $e->getMessage();
}//Consultas para ingresar valores
try {
$sql = “insert into persona (nombre,edad) values(‘Soy Batman’,35);”;
$stmt = $con->prepare($sql);
$stmt->execute();
}
catch (PDOException $e)
{
echo ‘Error conectando con la base de datos: ‘ . $e->getMessage();
}?>
La única línea a modificar
Para MySQL
$con = new PDO(‘mysql:host=localhost;dbname=pdotest’, ‘pdo’, ‘test’);
Para SQLite
$con = new PDO(‘sqlite:dragon.db’);
Un video demostrativo.