ADODB_active_record

Estructura basica

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.

Campos como atributos

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();

consulta

la clase cuenta con dos metodos principales para obtener datos de consulta:

Find($whereOrderBy, $bindarr=false, $pkeyArr=false)

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));

Load($where)

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  ");

GetActiveRecords($table,$whereOrderBy,$bidarr=false)

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

Insercion o actualizacion

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.

Eliminacion

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';

Manejo de errores

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

Transactiones

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

Relacion uno a muchos

adodb las soporta con las funciones ClassHasMany() , ClassBelongsTo() este ultimo no resulto eficiente en las pruebas por eso no se documenta completamente

ClassHasMany

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();
  }

cargar relaciones

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);
		}
	}