Problema na Inserção

Olá a todos,

Bom esse erro, ocorreu depois o cliente salientar que alguns registro estão sendo atualizando pelo próximo registro inserido.

Exemplo:

João foi cadastrado na instituição CAMS I, e gero o ID 100

Foi salvo!

Maria foi cadastrada na instituição CAMS II, e pega o mesmo ID 100.

O cliente saliento, que esse tipo, ocorre quando eles muda a instituição(origem).

O banco de dados tem auto-incremento na coluna ID, e não tem usar o mesmo registro.

E no controller Paciente, o save() está normal, por que se eu colocar save(false), ele vai substituir sempre o ultimo ID.

Alguem tem uma solução?

Vou postar parte o actionCreate() do PacienteController.




public function actionCreate() {

        $model = new Paciente;

        $telefone = new Telefone;


        // Uncomment the following line if AJAX validation is needed

        $this->performAjaxValidation($model);


        if (isset($_POST['Paciente'])) {


            $_POST['Paciente']['datacriacao'] = date('Y-m-d H:i:s');

            $_POST['Paciente']['datanascimento'] = formatarData($_POST['Paciente']['datanascimento'], '/');

            $_POST['Paciente']['dataavaliacao'] = formatarData($_POST['Paciente']['dataavaliacao'], '/');


            array_walk($_POST['Paciente'], 'uppercase');


            $model->attributes = $_POST['Paciente'];


            if ($model->save()) {


                if (isset($_POST['Telefone'])) {


                    $quant = count($_POST["Telefone"]["titulo"]);


                    $i = 0;

                    foreach ($_POST["Telefone"] as $i => $item) {

                        $attributes[] = $i;

                        $i++;

                    }




                    for ($i = 0; $i < $quant; $i++) {

                        if ($_POST["Telefone"]["titulo"]["$i"] <> '') {


                            $telefone = new Telefone;

                            $codtelefone = db()->createCommand("SELECT MAX(codtelefone) FROM telefone")->queryScalar() + 1;


                            for ($j = 0; $j < count($attributes); $j++) {

                                $attrib = $attributes[$j];

                                $telefone->$attrib = strtoupper($_POST["Telefone"]["$attrib"]["$i"]);

                            }


                            $telefone->codtelefone = $codtelefone;

                            $telefone->datacriacao = date('Y-m-d H:i:s');

                            $telefone->cod = $model->codpaciente;

                            $telefone->bd = controller();

                            $telefone->save(false);

                        }

                    }

                }


                if ($_POST["botao"] == "adicionar")

                    $this->redirect(array('index', 'alerta' => 'ok'));

                else if ($_POST["botao"] == "adicionaroutro")

                    $this->redirect(array('create', 'alerta' => 'ok'));

                else if ($_POST["botao"] == "adicionareditar")

                    $this->redirect(array('update', 'id' => $model->codpaciente, 'alerta' => 'ok'));

            }

        }


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

            'model' => $model,

            'telefone' => $telefone,

            'alerta' => 'ok'

        ));

    }



WTF???

Aparentemente não tem nada de errado apesar de jurar que não entendi o seu foreach.


$i = 0;

foreach ($_POST["Telefone"] as $i => $item) {

  $attributes[] = $i;

  $i++;

}

Mas, como o problema é o paciênte, vamos deixar pra lá …

Tenta setar null explicitamente para o ID e deixar ele como safe no model. Tb habilita o profile no config e pegar os SQLs que ele ta fazendo pelo Log do Yii. Talvez dê uma luz.


    'log'=>array(

      'class'=>'CLogRouter',

      'routes'=>array(

        array(

          'class'=>'CFileLogRoute',

          'levels'=>'profile',

        ),

      ),

    ),



Não sei se eixiste algum problema no FW com campos auto-inc, pq eu uso UUID gerado por um behavior, mas vale uma pesquisa.

Como essa action ai só funciona pra criar, vc pode forçar eel a criar usando $model->isNewRecord = true antes do save que deve funcionar.

Quando ao cache (Ví vc falando lá na lista de PHP do Google), ele realmente não tem nada haver. É só pra metadados mesmo …

Daniel,

Sobre o ‘foreach’, era de uma listagem de telefones, pensei que ia haver muitos atributos, para não ter que ficar declarando um por um, fiz isso.

Antes de postar aqui, desativei o schemaCaching, até o momento não tive reclamação.

Edit:desativei o ‘cache’=>array(‘class’=>‘system.caching.CFileCache’) TAMBÉM.

Coloquei o ‘codpaciente’, como safe no Model, e inseri o CFileLogRoute(profile), vamos ver no decorrer do uso.

Valeu pela atenção.

Curiosidade, qual versão do Yii vc ta usando?

Se não me engano a versão 1.1.4, senao a 1.1.3,

Sempre mantenho atualizado novos projetos que desenvolvo.