2
respostas

Dados em mais de uma Tabela

Tenho uma tabela de Pessoas e outra de Telefone.. relação 1-N como... quanto a gravar os dados de pessoas é tranquilo.. tenho um metodo cadastraPessoa que realiza o cadastro.. mas não sei como fazer para recuperar o id de Pessoa e como faço pra gravar telefone.. seria um outro controller? gravo dentro do proprio metodo cadastrarPessoa?

2 respostas

Janai Levi, vejo que abriu esta dúvida referente ao curso de PHP, no meu caso eu resolvi esse problema realizando o curso de Spring MVC. Logo a implementação muda mas o problema é o mesmo.

Você está utilizando alguma ferramenta de ORM ? Ou está persistindo os seus dados na mão?

Quando eu digo na mão, provavelmente na tecnologia que você estiver utilizando para persistir os dados, terá um método tipo getReturnedKeys aonde você receberá a chave primária do objeto que você acabou de inserir no banco. Você tem que receber os parâmetros a partir do seu formulário e montar os dois objetos Pessoa e Telefone.

Após isso, você seta dentro de Pessoa o Telefone. Você tem que se certificar que relacionou o Telefone a esta pessoa (na tabela Pessoa você coloca uma coluna telefone_id que é a chave estrangeira para a tabela Telefone aonde estarão armazenados os dados de Telefone correto..)

E se for utilizando um ORM, dependendo de como os relacionamentos estiverem definidos, a própria ferramenta vai realizar esse trabalho para você ao persistir as entidades. Claro se tudo estiver definido direitinho e você passar os parâmetros fazendo o binding desses parâmetros corretamente com o objeto a ser recebido no controlador.

Creio que você está querendo cadastrar uma pessoa e está enviando juntamente os telefones dela correto? Então no mesmo controlador que recebe os dados de pessoa você também recebe os dados do telefone ok. Somente um controlador da pra fazer isso.

Se estiver complicado num momento inicial, nada lhe impede de apenas criar na mesma tabela de Pessoa colunas referentes a mais de um telefone e só receber esses parâmetros e salvar essa pessoa diretamente. Claro que essa não é a solução mais recomendada e nem elegante, caso você passe a inserir numa tabela Pessoa muitos dados relativos a telefones, talvez.

É o que acontece com Endereço por exemplo, porque aí já entra cep, numero, logradouro, complemento, bairro, cidade, estado, etc, então já são tantos dados relativos a Endereço que justifica se criar uma tabela só pra guardar os dados dessa entidade.

Tomara que tenha ajudado.

Dá uma olhadinha no meu controller:

<?php
namespace App\Controller;

use Cake\Event\Event;
use Cake\ORM\TableRegistry;

class ResponsaveisController extends AppController {

    public function index(){
       $responsaveisTable = TableRegistry::get('Responsaveis');
       $responsavel = $responsaveisTable->newEntity();

       $this->set('responsavel',$responsavel);

    }

    public function cadastrarResponsavel($id){

       $responsaveisTable = TableRegistry::get('Responsaveis');
       $responsavel = $responsaveisTable->newEntity( $this->request->data());

       if($responsaveisTable->save($responsavel)){
            $msg = 'Responsável cadastrado com sucesso!';
            $this->Flash->set($msg,['element'=>'success']);
        }
        else{
            $msg = 'Erro ao cadastrar responsável!';
            $this->Flash->set($msg,['element'=>'error']);
        }
         $this->redirect('/responsaveis');
    }

}
RESPONSAVEIS
id_responsavel (PK)
nome
cpf
rg
dt_nascimento
rua
numero
complemento
bairro
cidade
estado
cep
dt_cadastro
TELEFONES
id_telefone (PK)
telefone
id_responsavel (FK)