una vez creada la base de datos podemos acceder a los datos de las tablas a través de esta clase , para ello en la carpeta de controllers se crea un archivo con las con la definicion de la clase, la forma basica tiene la siguiente estructura :
<?php
class nombre_tabla extends ADOdb_Active_Record{
function __construct(){
parent::__construct("nombre_tabla");
}
}
?>
esta es la estructura basica con nombre de la tabla en la carpeta controllers hay un ar chivo __crear_controllers.php el cual al ejecutarse crea automaticamente en esa carpeta los controladores q falten consultando la bases de datos.
al definirse una tabla como clase los campos de la clase se referencian como atributos publicos
$objeto=new nombre_tabla(); $objeto->campo='un valor'; echo $obj->otro_campo; . . . //este es un metodo para obtener todos los nombres de los campos de la tabla en un array $atributos=$objeto->getAttributeNames();
la clase cuenta con dos metodos principales para obtener datos de consulta:
este metodo retorna un array de objetos(objeto x registro ) como resultado de hacer un select de los datos de la tabla, los parametros son :
ejemplos
$obj = new nombre_tabla();
//solo con el primer parametro
$lista = $obj->Find("campo1 like 'algo%' AND campo2 > 3 ORDER BY campo3 ");
//con el array de parametros
$lista = $obj->Find("campo1 like ? AND campo2 > ? ORDER BY campo3 ", array('algo%',3));
este metodo retorna un carga el un unico registro en el objeto como resultado de hacer un select de la tabla, tiene un parametro:
ejemplos
$obj = new nombre_tabla();
//cargar por el id
$obj->Load("id = 3");
print_r($obj);
//o puede ser una combinacion de restricciones q retornen un objeto
$lista = $obj->Load("campo1 like 'uno' AND campo2 > 10 ");
este es un metorodo del objeto de conexion a la base de datos permite cargar objetos active record sus parametros son
$table = 'nombre_tabla'; $whereOrderBy = "campo1 LIKE 'A%' ORDER BY campo2"; $lista = $con->GetActiveRecords($table, $whereOrderBy); //imprime resultados foreach($lista as $rec) echo "\n".$rec->campo1' '.$rec->campo2
se cuanta con los metodos Insert() y Update(), para insertar o actualizar, pero tambien un objeto active record utiliza el metodo save() , al usar este ultimo se debe tener en cuenta q si el objeto no ha sido cargado (con load , find o getActiveRecords ) la clase va a insertarlo si ha sido cargado ejecutara el update.
ejemplos
$obj = new nombre_tabla();
// Insertar modo 1
$obj->campo1='algo';
$obj->campo2=5;
$rs=$obj->Insert();
if(!$rs) echo 'Error';
// Insertar modo 2
$obj->campo1='algo';
$obj->campo2=5;
$rs=$obj->save();
if(!$rs) echo 'Error';
// Actualizar modo 1
$obj->id=2;
$obj->campo1='nuevo valor';
$obj->campo2=54;
$rs=$obj->Update();
if(!$rs) echo 'Error';
// Actualizar modo 2 despues de cargar el objeto
$obj->Load("id=2");
$obj->campo1='nuevo valor';
$obj->campo2=54;
$rs=$obj->Update();
if(!$rs) echo 'Error';
print_r($obj);
//o puede ser una combinacion de restricciones q retornen un objeto
$lista = $obj->Load("campo1 like 'uno' AND campo2 > 10 ");
es recomendable hacer uso de estos objetos cuando se hace insersion o actualizacion de un registro a la vez ya que si se requiere actualizar mas objetos resulta mas eficiente ejecutar la SQL directamente con el objeto de conexion a la base de datos.
para esto se hace uso del metodo Delete()
$obj = new nombre_tabla();
// modo 1 despues de cargar el objeto
$obj->Load("id=1);
$rs=$obj->Delete();
if(!$rs) echo 'Error';
// modo 2 solo dando valor a las llaves primarias
$obj->id=1;
$rs=$obj->Delete();
if(!$rs) echo 'Error';
este se hace igual q con el objeto de coneccion
ErroMsg() retorna el ultimo error q se produjo;
ErroNo() retorna el numero del ultimo error q se produjo
la estructuta de una transaccion seria:
. . . $con->StartTrans(); $objeto1->save(); $objeto_x->save(); $con->CompleteTrans();
esto funciona pata objetos de diferentes tablas , en una transaccion en tablas con id tipo serial este no se puede consultar hasta despues de terminar la transaccion
adodb las soporta con las funciones ClassHasMany() , ClassBelongsTo() este ultimo no resulto eficiente en las pruebas por eso no se documenta completamente
para definir una relacion uno a muchos se usa la funcion estatica
ADODB_Active_Record::ClassHasMany($clase, $clase _dependiente, $nombre_fk= '').
si $nombre_fk no se define por defenco lo toma <$clase>_id
ejemplo
//archivo persona.php
class persona extends ADOdb_Active_Record{....}
ADODB_Active_Record::ClassHasMany('persona', 'finca','persona_id');
///en otro archivo
$per = new persona();
$per->Load("id=1");
foreach($per->finca as $f) {
echo " $f->nombre ";
}
//si no se carga ningun dato entonces esto devuelve un array vacio:
$per2 = new persona();
$lista = $per2->finca; // $lista esta vacio array()
por defecto los datos devueltos en esta operacion no estan ordenados.
para crear o guardar registros el procedimiento seria como se muestra a continuacion
class persona extends ADOdb_Active_Record{...}
class finca extends ADOdb_Active_Record{...}
ADODB_Active_Record::ClassHasMany('persona', 'finca','persona_id');
$per = new persona();
for ($i=0; $i<10; $i++) {
$per->finca[$i] =new finca();
}
$per->nombre='aaaaaa';
$per->apellido='bbbbbb';
$persona->save();
foreach($person->finca as $fin) {
$fin->nombre_finca=' ffffff';
$fin->save();
}
se usa para filtrar los datos de la consulta usando el metodo LoadRelations($relation, $whereOrderBy = '', $offset = -1, $limit = -1): para $offset primer registro es el 0, $limit es la cantidad de registros a recibir.
//una vez creada la clase persona
ADODB_Active_Record::ClassHasMany('persona', 'finca','person_id');
$per = new persona();
$per->Load('id=23');
//filtrar las fincas ubicadas en pasto
$per->LoadRelations('finca',"ciudad='Pasto' order by nombre_finca");
if ($per->finca) {
foreach ($per->finca as $fin) {
imprimir( $fin);
}
}
Si hubiesen demasiados registros y se necesita paginar se puede usar los parametros offset y limit:
$per->LoadRelations('finca',"ciudad='Pasto' order by nombre_finca",0, 5);
if ($per->finca) {
foreach ($per->finca as $fin) {
imprimir( $fin);
}
}