Problemas Com Save (Autoincrement De Relations)

Boa tarde,

Estou com o seguinte problema…

Possuo uma classe que há nela 3 relations,


public function actionCreate() {

        $model = new Escritorio;

        $model->endereco = new Endereco;

        $model->observacao = new Observacao;

        $model->loginWeb = new LoginWeb;

Caso ocorra tudo bem ao final,

o seguinte código é executado


$trans->commit();

                $this->redirect(array('view', 'id' => $model->id));

porém se ao final gerar alguma exception


catch (Exception $e) {

                /* CATCH DE ERROS + ROLLBACK DA TRANSAÇÃO */

                $trans->rollback();

            }

é feito um rollback, agora apresentando meu problema:

Todas essas relations possuem primary key com auto increment, porém se gerar um erro, essa chave some e no próximo post a chave anterior não é usada e sim, a anterior+1, simulando erros, nas chaves de observação fiquei com uma brecha de 20 id’s

pulou do 135 para o 155 (Imagem em anexo)

e não sei mais o que fazer para resolver…

Alguém já passou por isso e pode ajudar?

Atenciosamente,

Rafael

Rafael,

Posta sua actionCreate completa aqui.

  1. Você disse que tem 3 relationamentos, essas 3 tabelas tem chave secundário ou somente chave primária?

    /**

     * Cria um novo Escritório

     * Caso o cadastro seja efetuado com sucesso o mesmo será redirecionado a tela view

     */

    public function actionCreate() {

        $model = new Escritorio;

        $model->endereco = new Endereco;

        $model->observacao = new Observacao;

        $model->loginWeb = new LoginWeb;

        // Descomentar para usar Validação Ajax

        // $this->performAjaxValidation($model);

        /* CREATE - POST */

        if (null !== Funcoes::filter('post', 'Escritorio')):

            $trans = Yii::app()->db->beginTransaction();

            try {

                /*

                 * ATRIBUIÇÃO DO POST AOS RESPECTIVOS OBJETOS

                 */

                $model->attributes = Funcoes::filter('post', 'Escritorio');

                $model->observacao->attributes = Funcoes::filter('post', 'Observacao');

                $model->endereco->attributes = Funcoes::filter('post', 'Endereco');

                /*

                 * SAVE OBSERVACAO - Caso sejá diferente de vazio 

                 */

                if (empty($model->observacao_id)):

                    if (!empty($model->observacao->texto)):

                        $model->observacao->texto = trim($model->observacao->texto);

                        if ($model->observacao->save(true)):

                            $model->observacao_id = $model->observacao->id;

                        else:

                            throw new Exception;

                        endif;


                    else:

                        throw new Exception;

                    endif;

                endif;

                /*

                 * FIM SAVE OBSERVAÇÃO 

                 */

                /*

                 *  SAVE ENDEREÇO 

                 */

                if (empty($model->endereco_id)):

                    if ($model->endereco->save(true)):

                        $model->endereco_id = $model->endereco->id;

                    else:

                        throw new Exception;

                    endif;

                endif;

                /*

                 * FIM SAVE ENDEREÇO 

                 */

                /*

                 * SAVE ESCRITÓRIO 

                 */

                if ($model->save(true)):

                    /*

                     * SAVE LOGIN - SAVE ESCRITÓRIO 

                     */

                    if (empty($model->login_web_id)):

                        if ($model->loginWeb->generateLogin($model, 'escritorio')):

                            $model->login_web_id = $model->loginWeb->id;

                            if ($model->save(true)):

                                /*

                                 * FIM SAVE LOGIN - SAVE ESCRITÓRIO 

                                 */

                                /*

                                 * SAVE TAGS 

                                 */

                                if (null != Funcoes::filter('post', 'tags')):

                                    foreach (Funcoes::filter('post', 'tags') as $tag):

                                        if (!EscritorioTag::addTag($model, $tag, 'escritorio')):

                                            throw new Exception;

                                        endif;

                                    endforeach;

                                endif;

                                /*

                                 * FIM SAVE TAGS 

                                 */

                                /*

                                 * SAVE EMAILS 

                                 */

                                if (null != Funcoes::filter('post', 'emails')):

                                    foreach (Funcoes::filter('post', 'emails') as $new_email):

                                        if (!Email::addEmail($new_email, $model, 'escritorio')):

                                            throw new Exception;

                                        endif;

                                    endforeach;

                                endif;

                            /*

                             * FIM SAVE EMAILS 

                             */

                            else:

                                throw new Exception;

                            endif;

                        else:

                            throw new Exception;

                        endif;

                    endif;

                /*

                 * COMMIT DA TRANSAÇÃO + REDIRECT 

                 */

                else:

                    throw new Exception;

                endif;

                $trans->commit();

                $this->redirect(array('view', 'id' => $model->id));

            } catch (Exception $e) {

                /* CATCH DE ERROS + ROLLBACK DA TRANSAÇÃO */

                $trans->rollback();

            }

        endif;

        /* FIM CREATE - POST */


        $this->render('create', array(

            'model' => $model

        ));

    }

Este é o código completo,

as tabelas possuem apenas uma chave primária…

Rafael,

Me parece que o beginTransaction() não está segurando os insert, ai quando da erro, ele deleta esses registro, e como as tabelas é auto incremento, esses ID são perdido.

No lugar do:

$trans = Yii::app()->db->beginTransaction();

Tenta:

$trans = $model->getDbConnection()->beginTransaction();

Bom dia,

não resolveu… porém acredito que isso seja uma segurança do banco de dados pelo que pesquisei… mas procuro uma forma de amenizar essa diferença entre id’s…

aqui uma pessoa explica um pouco melhor sobre isso…

Rafael,

Se eu estivesse com esse problema, eu tentava resolver da seguinte maneira.

  1. Debugar inserção por inserção, verificar onde o sistema está inserindo e o por que está inserindo.

  2. Eu não uso auto incremento, por que não gosto de perde ID no banco de dados.


Lendo um pouco no stackoverflow que mandou, foi o que eu disse, por ser auto incremento, ele já vai registrando os valores, para caso outro usuário não use o mesmo ID, e no final o sistema finaliza a inserção caso tenha sucesso ou remove todo o registro caso não tenha sucesso, como os campos são auto incremento, você perde esse ID, por isso que as vezes você perde 20 ID’s.