<?php
abstract class Model {
/**
* Tabela representativa.
* @var [array]
*/
private $_Table;
/**
* Meta-Descrições dos Campos.
* @var [array]
*/
protected $_Meta;
/**
* Listagem dos Campos.
* @var [array]
*/
protected $_Fields;
/**
* Listagem de Campos que não são podem ser Nulos.
* @var [array]
*/
protected $_NotNull;
/**
* Instância de banco de dados Singleton.
* @var [PDO]
*/
protected static $db;
/**
* Listagem de todas as instâncias.
* @var [array][array]
*/
private static $_Cache;
public static function _Instance() {
self::$db = new db();
}
/**
* Define a tabela que será usada no objeto.
* @param [string] $table Tabela representativa.
*/
private function setTable($table) {
# Verifica se a entrada é válida.
if(empty($table))
throw new Exception("A tabela não pode ser vazia.");
# Define a tabela na classe.
$this->_Table = $table;
}
public function Insert() {
try
{
Validate::Run($this);
foreach($this->_Fields as $Field)
$binds[':' . $Field] = $this->{$Field};
$values = implode(', ', keys($binds));
$fields = $this->_Fields;
unset($fields[0]);
$fields = implode(', ', $this->_Fields);
$query = "INSERT INTO ". $this->_Table ."(". $fields .") VALUES(". $values .")";
self::e($query, $binds);
$this->Select(self::$db->lastInsertId());
}
catch(Exception $e)
{
echo $e->getMessage();
return false;
}
}
public function Select($id = NULL) {
if(is_null($id)) {
$id = $this->{$this->_Fields[0]};
if(is_null($id))
throw new Exception("Impossível realizar select com id nulo da tabela ". $this->_Table .".");
}
$fields = implode(', ', $this->_Fields);
$query = "SELECT ". $fields ." FROM ". $this->_Table ." WHERE ". $this->_Fields[0] ." = ?";
$stmt = self::e($query , array($id));
$row = $stmt->fetch(PDO::FETCH_ASSOC);
if($row) {
$this->_ResetFields();
foreach($this->_Fields as $Field)
$this->{$Field} = $row[$Field];
# $this->{'Hash'} = Bcrypt::hash($id . $this->_Table);
self::$_Cache[$this->_Table][$this->_Fields[0]] = $this;
}
else
throw new Exception("Id ". $id ." não existe na tabela ". $this->_Table);
}
public function Delete($id = NULL) {
if(is_null($id)) {
$id = $this->{$this->_Fields[0]};
if(is_null($id))
throw new Exception("Impossível deletar um id nulo da tabela ". $this->_Table .".");
}
$query = "SELECT ". $fields ." FROM ". $this->_Table ." WHERE ". $this->_Fields[0] ." = ?";
$stmt = self::e($query , array($id));
if($stmt->fetch()) {
if(Db::$VirtualDeletion['on']) {
$query = "UPDATE ". $this->_Table ." SET ". Db::$VirtualDeletion['Field'] ." = '". Db::$VirtualDeletion['Value'] ."' WHERE ". $this->_Fields[0] ." = ?";
self::e($query, array($id));
}
else {
$query = "DELETE FROM ". $this->_Table ." WHERE ". $this->_Fields[0] ." = ?";
self::e($query, array($id));
}
return true;
}
else
throw new Exception("O id ". $id ." não pode ser excluído da tabela ". $this->_Table ." pois não existe.");
}
public function Update($id = NULL) {
if(is_null($id)) {
$id = $this->{$this->_Fields[0]};
if(is_null($id))
throw new Exception("Impossível realizer update em um id nulo da tabela ". $this->_Table .".");
}
Validate::Run($this);
foreach($this->_Fields as $Field)
$binds[':' . $Field] = $this->{$Field};
$fields = $this->_Fields;
unset($fields[0]);
foreach($fields as $Field)
$values[] = $Field .' = '. $this->{$Field};
$values[] = implode(', ', $values);
$query = "UPDATE ". $this->_Table ." SET ". $values ." WHERE ". $this->_Fields[0] ." = :" . $this->_Fields[0];
self::e($query, $binds);
unset(
self::$_Cache[$this->_Table][$this->_Fields[0]]
);
$this->Select($id);
}
/**
* Limpa os objetos da memória cache.
*/
public static function Clear() {
unset(self::$_Cache);
}
protected static function e($query, $binds) {
$_stmt = self::$db->prepare($query);
$_stmt->execute($binds);
return $_stmt;
}
protected static function q($query) {
return self::$db->query($query);
}
public function __destruct() {
self::$db = null;
unset(self::$_Cache);
}
}
?>
preferences:
44.28 ms | 402 KiB | 5 Q