Tengo ya bastante tiempo trabajando en PHP, pero soy relativamente nuevo para lo que es PHP5 por lo que el fin de semana pasado decidí dar el salto y empezar portando a PHP algo que había hecho una ve en Java. La idea es una implementación de ActiveRecords, o lo que es lo mismo, una clase que te permita crear los objetos de acceso a la base de datos sin necesidad de crearlos tú.
Lo he llamado PHP5DBObject (traten de conseguir un nombre mejor y que esté disponible en SourceForge ) en fin he creado ahí el proyecto y lo estoy liberando bajo una licencia LGPL, pero quería pedir (a quien tenga un rato) que le de un vistazo y me haga cualquier recomendación que le venga a la cabeza.
La página del proyecto es: http://sourceforge.net/projects/php5dbobject
Un poco la idea es la siguiente: Supón que tienes la siguiente tabla:
usuario
id: int auto_increment
name: varchar(100)
Pues para poder acceder a los datos de la tabla te basta con:
Código PHP:
<?php
require_once 'PHP5DBObject.php';
$config = array(
'Usuario' => array(
'table' => 'usuario',
'fields' => ('id' => 'integer', 'name' => 'text')),
'pk' => array('id' => array('insert' => false))
)
);
PHP5DBObject::setup($config);
PHP5DBObject::setDefaultConnection($conn); // Conn es un objeto de conexión que implemente DBManager (se incluye uno)
// Hecho esto ya se puede trabajar con la base de datos.
// Crear un usuario es:
$usuario = new Usuario();
$usuario->name = 'Paolo';
$usuario->create();
print $usuario->id; // Contiene el valor del id auto-asignado
// Para obtener un usuario:
$id = 4;
$usuario =& Usuario::factory($id);
print $usuario->id . ': ' . $usuario->name;
// Para obtener los usuarios que empiecen por 'Pa' sería (primera página de hasta 50 registros):
$usuarios = Usuario::browse("name like '?%'", array('Pa'), 'name asc', 50, 1);
foreach($usuarios as $usuario) {
print $usuario->id . ': ' . $usuario->name . '<br/>';
}
// Eliminar un usuario sería:
Usuario::delete(4);
// Actualizar un usuario es:
$id = 4;
$usuario =& Usuario::factory($id);
$usuario->setName('Nuevo nombre'); // también soporta getters y setters a la Java
$usuario->update();
?>
id: int auto_increment
usuario_id: int
email: varchar(100)
Bastaría con que el config sea:
Código PHP:
$config = array(
'Usuario' => array(
'table' => 'usuario',
'fields' => ('id' => 'integer', 'name' => 'text')),
'pk' => array('id' => array('insert' => false)),
'methods' => array(
'getEmails' => array(
'method' => 'getList',
'class' => 'Email',
'table' => 'email',
'select' => array(array('tableField' => 'id', 'classField' => 'id')),
'where' => array(array('tableField' => 'usuario_id' , 'instanceField' => 'id'))
)
)
),
'Email' => array(
'table' => 'usuario',
'fields' => ('id' => 'integer', 'usuario_id' => 'integer', 'name' => 'text')),
'pk' => array('id' => array('insert' => false)),
'methods' => array(
'getUser' => array(
'method' => 'getFK',
'class' => 'User',
'fieldMaps' => array(array('classField' => 'id', 'instanceField' => 'usuario_id'))
),
'setMain' => array(
'method' => 'setFK',
'class' => 'User',
'fieldMaps' => array(array('classField' => 'id', 'instanceField' => 'usuario_id'))
)
)
)
);
Código PHP:
$usuario =& Usuario::factory(4); // Obtienes el usuario id=4
$emails = $usuario->getEmails();
foreach ($emails as $email) {
print $email->email . '<br/>';
}
Tiene también (por desarrollar) un soporte para cache.
En fin, si les parece interesante, les animo a que le den un vistazo y por favor, no duden en hacerme cualquier pregunta.
Saludos