/** * Inicia a anlise de um objeto * @return void */ public function init() { $ref = new ReflectionClass($this->object); $parentClassesArray = array($ref); while ($ref->getParentClass()->getName() != CRUD::getTopLevelClass()) { $ref = $ref->getParentClass(); $parentClassesArray[] = $ref; } $parentClassesArray = array_reverse($parentClassesArray); foreach ($parentClassesArray as $ref) { /*@var $ref ReflectionClass */ foreach ($ref->getProperties() as $prop) { /* @var $prop ReflectionProperty */ $this->readDocComment($prop); } } $this->initCheck = true; }
/** * Cria a tabela no banco conforme os dados da tabela, se vc precisa alterar a estrutura * da tabela, ou use um Gerenciador de BD para alterála (lembre-se de atualizar * o PHPDoc) * */ public function createTable($topLevelClass = "", $onDelete = "SET NULL", $onUpdate = "CASCADE") { $pkStr = ""; if (empty($topLevelClass)) { $topLevelClass = CRUD::getTopLevelClass(); } $sqlToSave = ""; $ref = new ReflectionClass($this->DAO_Object); $parentClassesArray = array($ref); while ($ref->getParentClass()->getName() != $topLevelClass) { $ref = $ref->getParentClass(); $parentClassesArray[] = $ref; } $parentClassesArray = array_reverse($parentClassesArray); foreach ($parentClassesArray as $ref) { //caso tenha superClasses $superTableName = $this->buildTableName($ref->getName()); /******************************************************************* * GERAÇÃO DE SUPER-TABELAS * gera as tabelas das classes pais ******************************************************************/ $sql = ""; $sql .= "CREATE TABLE IF NOT EXISTS `" . Connection::getDataBaseName() . "`.`" . $superTableName . "` ("; $fks = ""; foreach ($this->buildTableColumns($ref->getName()) as $column) { if (count($column) <= 2) { continue; } $sql .= "`" . $column[0] . "` " . $column[2] . " "; $cont = 0; foreach ($column as $columnDetail) { if ($cont > 2) { $sql .= $columnDetail . " "; } ++$cont; } if (class_exists($column[1])) { try { $onDeleteConst = $ref->getConstant(self::ON_DELETE_CLASS_CONST); $onUpdateConst = $ref->getConstant(self::ON_UPDATE_CLASS_CONST); if ($onDeleteConst) { $onDelete = $onDeleteConst; } if ($onUpdateConst) { $onUpdate = $onUpdateConst; } } catch (Exception $ex) { } $fks .= ", CONSTRAINT `fk_" . $ref->getName() . "_" . $column[0] . "`\r\n\t\t\t\t\t FOREIGN KEY (`" . $column[0] . "` )\r\n\t\t\t\t\t REFERENCES `" . Connection::getDataBaseName() . "`.`" . $this->buildTableName($column[1]) . "` (`id` )\r\n\t\t\t\t\t ON DELETE {$onDelete}\r\n\t\t\t\t\t ON UPDATE {$onUpdate}"; } $sql .= " ,\r\n"; } // varre o array de chaves primárias para criar abaixo if (!empty($this->pkArray)) { $pkStr = ","; foreach ($this->pkArray as $pk) { $pkStr .= "`{$pk}`, "; } $pkStr = substr($pkStr, 0, -2); } $sql .= " PRIMARY KEY (`" . self::PRIMARY_KEY_NAME . "`{$pkStr})"; if (!empty($fks)) { $sql .= $fks; } if ($ref->getParentClass() && $ref->getParentClass()->getName() != $topLevelClass) { //caso tenha uma classe pai faz as FK $sql .= "\r\n\t\t\t\t , CONSTRAINT `fk_" . $ref->getParentClass()->getName() . "_" . $ref->getName() . "`\r\n\t\t\t\t FOREIGN KEY (`id` )\r\n\t\t\t\t REFERENCES `" . Connection::getDataBaseName() . "`.`" . $this->buildTableName($ref->getParentClass()->getName()) . "` (`id` )\r\n\t\t\t\t ON DELETE CASCADE\r\n\t\t\t\t ON UPDATE CASCADE\r\n\t\t\t"; } $sql .= ") ENGINE=" . Connection::getEngine() . " DEFAULT CHARSET=" . Connection::getCharset() . ";"; //mysqli_query(CRUD::getConn() , $sql); $r = CRUD::executeQuery($sql); if (!$r) { echo "<h1>A tabela: " . $this->getDbTable() . " não pode ser criada</h1>"; echo "<code>" . $sql . "<c/ode>"; } else { echo 'Tabela "' . $superTableName . '" Criada com sucesso ! <br />'; } $sqlToSave .= $sql . "\n\n"; var_dump($sqlToSave); } $this->writeCreatesSql($sqlToSave); }