public function delete($id) { $phpDocMainObject = new PHPDoc(get_class($this)); # recupera as propriedades da classe $this->properties = $phpDocMainObject->getProperties(); $pk = $phpDocMainObject->getPK(); $delete = $this->oSQL->delete(); $delete->add($this->table); $delete->where($pk, '=', $id); $this->oSQL->getLink()->beginTransaction(); try { $this->oSQL->execute(); $this->oSQL->getLink()->commit(); } catch (\PDOException $e) { //@TODO Tratar exceção # se ocorrer exceção # 1 - desfazer a transação # 2 - capturar o erro # 3 - armazenar o erro # 4 - apresentar tela de erro (ver os tipos de erros e consequências) # se ocorrer exceção na classe principal, o script deverá ser cancelado. $this->oSQL->getLink()->rollBack(); /* * Se ocorrer excessão, os dados são passados para a classe de controle * de excessão do framework. Essa classe gerencia os dados que são passados * na interface do usuário e fornece as opções para solução do problema. */ excecao::debugException($e->getMessage(), $e->getCode(), $e->getTrace()); } }
/** * Nesse método cada classe é persistida de acordo * com as suas características, permite inclusive * usar base de dados diferentes */ public function save2() { /* * Substitui a variável $mainObject por $this que recupera os * dados da classe filha. */ $phpDocMainObject = new PHPDoc($this->class); // recupera as propriedades da classe $this->properties = $phpDocMainObject->getProperties(); // verificar se a chave primaria foi definida # recupera os atributos da classe principal //foreach ( $this->properties [get_class( $this )] as $vProperties ) { foreach ($this->properties[$this->class] as $vProperties) { // verificar se a chave primaria foi definida if ($phpDocMainObject->getPK() == $vProperties) { if (is_null($this->__get($vProperties))) { # PK não definida: insert continue; } else { # PK definida: update, clausula where necessária $where[$vProperties] = $this->__get($vProperties); continue; } } $mainData[$vProperties] = $this->__get($vProperties); } parent::getLink()->beginTransaction(); if (is_null($this->__get($phpDocMainObject->getPK()))) { # se PK = null: insert try { # insere um novo objeto no banco de dados $this->insert()->add($mainData, PREFIX_TABLE . $this->getClass()); $this->execute(); //$this->insert ( $mainData, PREFIX_TABLE.$this->getClass() ); # salva a transação //$this->conexao->commit(); parent::getLink()->commit(); # Quando um novo objeto é criado deve-se recuperar o id do objeto principal # e passa-lo para a FK correspondente $this->__set($phpDocMainObject->getPK(), $this->lastInsertId()); } catch (PDOException $e) { # se ocorrer exceção na classe principal, o script deverá ser cancelado. //$this->conexao->rollBack(); /* * Se ocorrer excessão, os dados são passados para a classe de controle * de excessão do framework. Essa classe gerencia os dados que são passados * na interface do usuário e fornece as opções para solução do problema. */ excecao::debugException($e->getMessage(), $e->getCode(), $e->getTrace()); } } else { try { # se ocorrer exceção na classe principal, o script deverá ser cancelado. # se a chave primária for definida, realizar update $this->update()->add($mainData, $where, PREFIX_TABLE . $this->getClass()); $this->execute(); # salva a transação //$this->conexao->commit(); parent::getLink()->commit(); //$this->link->commit(); } catch (PDOException $e) { # se ocorrer exceção na classe principal, o script deverá ser cancelado. //$this->conexao->rollBack(); parent::getLink()->rollBack(); /* * Se ocorrer excessão, os dados são passados para a classe de controle * de excessão do framework. Essa classe gerencia os dados que são passados * na interface do usuário e fornece as opções para solução do problema. */ excecao::debugException($e->getMessage(), $e->getCode(), $e->getTrace()); } //debug(__LINE__, "linhas afetadas: ".$this->getNumberRows() ); } }
/** * * @param unknown $mainObject */ public function save($mainObject) { #$phpDocMainObject = new PHPDoc( get_class( $mainObject ) ); $phpDocMainObject = new PHPDoc($this->class); // recupera as propriedades da classe $this->properties = $phpDocMainObject->getProperties(); // verificar se a chave primaria foi definida # recupera os atributos da classe principal foreach ($this->properties[get_class($mainObject)] as $vProperties) { // verificar se a chave primaria foi definida if ($phpDocMainObject->getPK() == $vProperties) { if (is_null($mainObject->__get($vProperties))) { # PK não definida: insert continue; } else { # PK definida: update, clausula where necessária $where[$vProperties] = $mainObject->__get($vProperties); continue; } } $mainData[$vProperties] = $mainObject->__get($vProperties); } // debug(__LINE__, "tab_".getdebug(__LINE__, $oCliente->getTelefone()->__get('telefone'));_class( $object ) ); // se pk = null : ação igual a insert #$this->conexao->beginTransaction(); # inicia uma transação $this->con->beginTransaction(); if (is_null($mainObject->__get($phpDocMainObject->getPK()))) { # se PK = null: insertthis->getCon()-> try { # insere um novo objeto no banco de dados #$this->insert ( $mainData, PREFIX_TABLE.get_class( $mainObject ) ); $this->insert($mainData, $this->getTable($this->class)); # salva a transação $this->con->commit(); # Quando um novo objeto é criado deve-se recuperar o id do objeto principal # e passa-lo para a FK correspondente $mainObject->__set($phpDocMainObject->getPK(), $this->lastInsertId()); } catch (\PDOException $e) { # se ocorrer exceção na classe principal, o script deverá ser cancelado. $this->con->rollBack(); /* * Se ocorrer excessão, os dados são passados para a classe de controle * de excessão do framework. Essa classe gerencia os dados que são passados * na interface do usuário e fornece as opções para solução do problema. */ excecao::debugException($e->getMessage(), $e->getCode(), $e->getTrace()); } } else { try { # se ocorrer exceção na classe principal, o script deverá ser cancelado. # se a chave primária for definida, realizar update #$this->update ( $mainData, $where, PREFIX_TABLE.get_class( $mainObject ) ); $this->update($mainData, $where, $this->getTable($this->class)); # salva a transação $this->con->commit(); } catch (\PDOException $e) { # se ocorrer exceção na classe principal, o script deverá ser cancelado. $this->con->rollBack(); /* * Se ocorrer excessão, os dados são passados para a classe de controle * de excessão do framework. Essa classe gerencia os dados que são passados * na interface do usuário e fornece as opções para solução do problema. */ excecao::debugException($e->getMessage(), $e->getCode(), $e->getTrace()); } //debug(__LINE__, "linhas afetadas: ".$this->getNumberRows() ); } # retira a classe principal do array unset($this->properties[$this->class]); # verifica se o array de classes não está vazio if (!empty($this->properties)) { # tratamento dos atributos das classes vinculadas # $derivedClass = nome da classe vinculada # $vAttribute1 : não tem valor ou uso foreach ($this->properties as $derivedClass => $vAttribute1) { // recupera as classes vinculadas # recupera a documentação da classe vinculada $phpDocDerivedObject = new PHPDoc($derivedClass); # $properties: recupera as propriedades (atributos) pertencentes as classes vinculadas $properties = $phpDocDerivedObject->getProperties(); index\debug(__FILE__, __LINE__, $vAttribute1); # verifica se o atributo pertencente a classe vinculada não está vazio #if (! empty ( $mainObject->__get( lcfirst( $derivedClass ) ) )) { if (!empty($mainObject->__get($vAttribute1))) { # # $value: objeto da classe vinculada foreach ($mainObject->__get($vAttribute1) as $key => $derivedObject) { foreach ($properties[$derivedClass] as $vAttribute2) { # verificar se a chave primaria foi definida if ($phpDocDerivedObject->getPK() == $vAttribute2) { if (is_null($derivedObject->__get($vAttribute2))) { # se não existir pk: insert continue; } else { # se existir PK: update, clausula where definida $where2[$vAttribute2] = $derivedObject->__get($vAttribute2); continue; } } # passo 1: verificar se o atributo é uma chave estrangeira if (in_array($vAttribute2, $phpDocDerivedObject->getFK())) { # passo 2: verificar se a chave estrangeira é null if (is_null($derivedObject->__get($vAttribute2))) { # passo 3: se a chave estrangeira for null significa que # que foi criado um objeto da classe principal # definir o valor da chave estrangeira $derivedObject->__set($vAttribute2, $mainObject->__get($phpDocMainObject->getPK())); } } $derivedData[$vAttribute2] = $derivedObject->__get($vAttribute2); } # fim do foreach # inicia uma transação $this->con->beginTransaction(); if (is_null($derivedObject->__get($phpDocDerivedObject->getPK()))) { try { # $this->insert($derivedData, $this->getTable($derivedClass)); # salva a transação $this->con->commit(); } catch (\PDOException $e) { # se ocorrer exceção uma mensagem deverá ser mostrada ao usuário. $this->con->rollBack(); /* * Se ocorrer excessão, os dados são passados para a classe de controle * de excessão do framework. Essa classe gerencia os dados que são passados * na interface do usuário e fornece as opções para solução do problema. */ excecao::debugException($e->getMessage(), $e->getCode(), $e->getTrace()); } } else { try { # #$this->update ( $derivedData, $where2, PREFIX_TABLE. $derivedClass ); $this->update($derivedData, $where2, $this->getTable($derivedClass)); #debug(__LINE__, "linhas afetadas: ".$this->getNumberRows() ); # salva a transação $this->con->commit(); } catch (\PDOException $e) { # se ocorrer exceção uma mensagem deverá ser mostrada ao usuário. $this->con->rollBack(); /* * Se ocorrer excessão, os dados são passados para a classe de controle * de excessão do framework. Essa classe gerencia os dados que são passados * na interface do usuário e fornece as opções para solução do problema. */ excecao::debugException($e->getMessage(), $e->getCode(), $e->getTrace()); } } # fim do else unset($where2); unset($derivedData); } # fim do foreach dos objetos derivados } // fim do if } // fim do foreach } // fim do: !empty( $this->properties ) }