Hola,
Estoy intentando crear un ORM sencillo para mi framework, para eso me he guiado en el tutorial de GatorV
http://web2development.blogspot.com/...iverecord.html
y revisando el código de otros frameworks que he usado. Bien como resultado he obtenido esto:
Código PHP:
Ver originalabstract class Modelo {
protected $table;
protected $keyField;
protected $db;
protected $fields = array(); private $_columns;
private $Config;
private $seteados = 0;
public $error = '';
public function __construct() {
$this->db = Database::singleton();
$this->iniciar();
}
protected function iniciar() {
//si no hay seteada una tabla corto el proceso y muestro el error.
$this->Config = Config::singleton();
if( !$this->table ) {
error_log("[".date("F j, Y, G:i")."] [E_USER_NOTICE] [tipo Modelo] No se seteo ninguna tabla para el modidelo: ".get_class($this)."\n", 3,$this->Config->get('root').'/errores.log'); die('No se seteo ninguna tabla para el modelo: '.get_class($this)); }
//obtengo los campos de la tabl
$query = "SHOW FIELDS FROM ".$this->table;
$command = $this->db->QueryArray($query);
$primary = '';
//recorro los campos y los guardo en un arrgeglo
for($i=0;$i<count($command);$i++) { $fields[$command[$i]['Field']] = array( "name" => $command[$i]['Field'],
"type" => $command[$i]['Type'],
"defaultValue" => $command[$i]['Default'],
"key" => $command[$i]['Key'],
);
//obtengo la clave primaria
if( $command[$i]['Key'] === "PRI" ) {
$primary = $command[$i]['Field'];
}
$this->fields[$command[$i]['Field']] = '';
}
$this->_columns = $fields;
if( empty( $primary ) ) { throw new Exception( "No se encontro la columna clave para la tabla: " . $this->table );
}
$this->keyField = $primary;
}
public function info() {
"name" => $this->table,
"columns" => $this->_columns,
"primary" => $this->keyField,
);
}
public function traerClavePrimaria() {
return $this->keyField;
}
public function buscarPorPk($id) {
//valido si el parametro es una arreglo o no
$valor = $id[$this->keyField];
}
else {
$valor = $id;
}
$sql = "SELECT * FROM `%s` WHERE `%s`='%s' LIMIT 1";
$sql = sprintf($sql, $this->table, $this->keyField, $valor); $consulta=$this->db->QuerySingleRowArray($sql);
if(!$consulta) {
$consulta=$this->db->Error();
}
foreach ($consulta as $key => $value) {
$this->$key = $value;
$this->fields[$key] = $value;
}
}
return $this;
}
public function buscarTodos() {
$sql = "SELECT * FROM ".$this->table;
$consulta = $this->db->QueryArray($sql);
if(!$consulta) {
$this->error = $this->db->Error();
}
return $consulta;
}
public function nuevo($valores) {
$vacio = 0;
//recorro los valores enviados y los voy asignando a los campos del registro
foreach ($valores as $key => $val) {
if(empty ($val) && $key != $this->keyField) { $vacio++;
}
$insertar[$key] = "'".trim($val)."'"; }
if($vacio == count($this->fields)) { $this->error = "Todos los campos estan vacios o los campos no existe en la tabla.<br/>";
return false;
}
else {
$consulta = $this->db->InsertRow($this->table, $insertar);
if(!$consulta) {
return false;
$this->error = $this->db->Error();
}
else {
//$consulta = $this->db->GetLastInsertID();
return true;
}
}
}
public function actualizar($valores) {
$vacio = 0;
//recorro los valores enviados y los voy asignando a los campos del registro
foreach ($valores as $key => $val) {
//valido si el campo existe en la tabla
if($key === $this->keyField) {
$filtro[$this->keyField] = $val;
}
$vacio++;
}
$actualizar[$key] = "'".trim($val)."'"; }
if($vacio == count($this->fields)) { $this->error = "Todos los campos estan vacios o los campos no existe en la tabla.<br/>";
return false;
}
else {
//actualizo el registro
$consulta = $this->db->UpdateRows($this->table, $actualizar, $filtro);
if(!$consulta) {
$this->error = $this->db->Error();
return false;
}
else {
return true;
}
}
}
public function guardar() {
//valido si se seteadon los campos automaticamente.
// si no estan seteados es porque se hizo a mano desde el controlador
if(!$this->seteados) {
//recorro los campos y voy asignando los valores
foreach ($this->fields as $key => $value) {
$this->fields[$key] = $this->$key;
}
}
// valido si en los campos seteados esta la clave primaria par saber si es
// una actualizacion o un nuevo registro
if(empty($this->fields[$this->keyField])) { return $this->nuevo($this->fields);
}
else {
return $this->actualizar($this->fields);
}
}
public function setearCampos($data) {
//Recorro el arreglo y lo asigno a los campos del registro
foreach ($data as $key => $value) {
//valido si existe la clave en el arreglo de los campos y lo asigno al campo
$this->fields[$key] = $value;
}
//valido si existe la clave primaria en el arreglo si no existe la seteo en vacio.
$this->fields[$this->keyField] = '';
}
}
//cambio el estado de la bandera seteados
$this->seteados = 1;
}
public function borrarPorPk($id) {
$filtro[$this->keyField] = $id;
$consulta = $this->db->DeleteRows($this->table, $filtro);
if(!$consulta) {
$this->error = $this->db->Error();
return false;
}
else {
return true;
}
}
public function borrarTodo() {
$consulta = $this->db->TruncateTable($this->table);
if(!$consulta) {
$this->error = $this->db->Error();
return false;
}
else {
return true;
}
}
}
entonces para usarlo en mi modelo hago algo asi:
Código PHP:
Ver originalclass usuario extends Modelo{
protected $table = 'usuarios';
}
y en mi controlador puedo hacer esto:
Código PHP:
Ver original//cargo el modelo
$this->modelo('usuarios');
$this->usuarios->nombre = 'juan';
$this->usuarios->apellido= 'perez';
$this->usuarios->edad= '25';
$this->usuarios->guardar();
o si los datos vienen por get/post puedo usar esto:
Código PHP:
Ver original//cargo el modelo
$this->modelo('usuarios');
$this->usuarios->setearCampos($_REQUEST);
$this->usuarios->guardar();
Hasta ahí todo de maravilla, el problema lo tengo cuando en mi tabla hay 2 claves primarias (los programas para diseñar base de datos, cuando tienes una campo que es una clave foranea de otra tabla, lo ponen como clave primaria), siempre me toma la segunda clave en vez de la primera. Como puedo evitar esto, sin necesidad de eliminar las claves de más que tengo?
Desde ya muchas gracias