Yii 2 - Criando e atualizando tabelas usando um único form

Olá pessoal,

Sou iniciante no Yii e estou com uma dúvida sobre inserção e atualização de dados usando tabelas diferentes com o mesmo form.

Encontrei tópicos parecidos no fórum, mas a sintaxe é para o Yii 1.x. Estou usando o Yii 2.

Para exemplificar, estou tomando como exemplo essa imagem no anexo.

Peço que alguém possa me ajudar, explicando um passo-a-passo sobre como relacionar essas tabelas e criando um único form para inserir e atualizar as informações das tabelas.

Por favor, peço que se alguém puder me ajudar, eu agradeço desde agora.

Obrigado.

Olá Rabugento, eu posso te ajudar sim. Mas preciso de mais detalhes do que vc quer fazer!.

Olá Levi,

Estou estudando Yii 2 há pouco mais de 1 mês e estou travado com relação a inserir registros usando um único form em mais de uma tabela.

A documentação do Yii 2 ainda está incompleta nessa parte, por isso que estou pedindo ajuda no fórum.

O Gii é útil para auxiliar na criação de MVC usando uma única tabela, mas não para mais de uma tabela em conjunto.

Como vc pode ver na figura acima, peguei esse exemplo para usar como guia.

Queria que alguém pudesse me ajudar a criar um form para essas 2 tabelas, que pudesse adicionar e editar registros nessas tabelas.

Agradeço se alguém puder me ajudar.

Alguem conseguiu auxiliar o amigo em sua duvida? Pois tenho o mesmo problema.

Fiz este modelo, porem não consigo inserir no banco:


public function actionCreate()

    {

        $pessoa = new Pessoa();

        $pessoa_fisica = new PessoaFisica();

        $pessoa_juridica = new PessoaJuridica();

        $telefone = new Telefone();


        $postData = Yii::$app->request->post();


        if($pessoa->load($postData) && $pessoa_fisica->load($postData) 

            && $pessoa_juridica->load($postData) && $telefone->load($postData)

            && Model::validateMultiple([$pessoa, $pessoa_fisica, $pessoa_juridica, $telefone])

            ){


            $pessoa->save();

            $pessoa_fisica->save();

            $pessoa_juridica->save();

            $telefone->save();

            return $this->redirect(['pessoa/view', 'id' => $id]);


        } 

        else { 

            return $this->render('create', [

            'pessoa' => $pessoa,

            'pessoa_fisica' => $pessoa_fisica,

            'pessoa_juridica' => $pessoa_juridica,

            'telefone' => $telefone,

            ]);

        }

    }

Agradeço desde já.

Por um acaso, um colega postou no grupo do G+. Talvez ajude a entender o conceito.

https://github.com/yiisoft/yii2/blob/master/docs/guide/input-tabular-input.md

Rabugento,

Você está com dúvida em inserção e atualização em qual tabela?

Posta uma imagem do form, e explique melhor quais as tabelas que você irá trabalhar.

Lucas,

No se formulário, você tem 4 tipo de cadastro?

De Pessoa, PessoaFisica, PessoaJuridica e Telefone?

Na verdade é um unico cadastro, as tabelas PessoaFisica e PessoaJuridia são uma especialização da tabela Pessoa, e a tabela Telefone armazena os telefones linkado a tabela Pessoa, assim posso armazer 1 ou mais telefones para as pessoas.

A questão do insert nas tabelas eu consegui resolver da seguinte forma(Porem ainda tenho o problema de nao ter que fazer o insert na pessoafisica ou juridica junto, cada hora deve ser uma condição diferente):




public function actionCreate()

    {

        $pessoa = new Pessoa();

        $pessoa_fisica = new PessoaFisica();

        $pessoa_juridica = new PessoaJuridica();

        $telefone = new Telefone();


        $postData = Yii::$app->request->post();

        

        

        if($postData){

            

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

            try {

                $pessoa->datacadastro = Yii::$app->formatter->asDate('now', 'yyyy-MM-dd');

                $pessoa->load($postData);

                if(!$pessoa->save()){

                    print_r($pessoa->getErrors());

                    die();

                };


                $pessoa_fisica->datanascimento

                $pessoa_fisica->codpessoa = $pessoa->codpessoa;    

                $pessoa_fisica->load($postData);

                if(!$pessoa_fisica->save()){

                    print_r($pessoa_fisica->getErrors());

                    die();

                    

                };

                $pessoa_juridica->codpessoa = $pessoa->codpessoa;

                $pessoa_juridica->load($postData);

                if(!$pessoa_juridica->save()){

                    print_r($pessoa_juridica->getErrors());

                    //die();

                    

                };


                $telefone->codpessoa = $pessoa->codpessoa;

                $telefone->load($postData);

                if(!$telefone->save()){

                    $telefone->save();

                    print_r($telefone->getErrors());

                    die();

                };

                

                

                $transaction->commit();

            } catch (\Exception $e) {

                $transaction->rollBack();

                throw $e;

                return $this->redirect(['pessoa/view', 'id' => $id]);


            }

        }

        

        return $this->render('create', [

            'pessoa' => $pessoa,

            'pessoa_fisica' => $pessoa_fisica,

            'pessoa_juridica' => $pessoa_juridica,

            'telefone' => $telefone,

            ]);

    }



Lucas,

Então a ordem seria, salvar primeiro a Pessoa, depois PessoaFisica OU PessoaJuridica (dependendo da opção que o cliente escolher) e depois os Telefones?

Correto isso mesmo, salva a Pessoa, PessoaFisica ou PessoaJuridica(De acordo com a opção escolhida no radioList) e depois os telefones.

Obrigado.