10
respostas

Relacionamento entre Tabelas

Estou tentando já a algum tempo salvar dados em mais de uma tabela e não consigo nem a pau.. Tenho uma tabela de Pessoas e Outra de Telefones.. onde uma pessoa pode ter varios telefones... alguem poderia me ajudar como faço pra gravar os telefones..

Eu recupero todos os dados pelo $this->request->data(); e gravo os Responsáveis mas não sei como recupero o id do responsavel pra salvar os telefones..

10 respostas

Nesse caso, para salvar uma entidade que depende de outra eu sugiro que você de uma olhada na forma com que o cake lida com associações. Assim, a gente consegue mapear quem pertence e quem possui. No nosso caso a classe Pessoa tem varios telefones e Telefones pertencem a uma pessoa =)

Ou seja, seria um relacionamento Pessoa HasMany Telefone e Telefone BelongsTo Pessoa!

Dessa forma conseguimos definir os telefones que uma Pessoa tem e ao salvar Pessoa no banco, os telefones iriam junto.

Mas, caso você queira o id para salvar, você pode recuperar o id pelo método lastInsertId da sua model:

$this->NomeDaModel->getLastInsertID();

Qualquer dificuldade, compartilha com a gente!

Abraço e bons estudos =)

Eu pesquisei sobre o hasMany mas nao consegui fazer funcionar... vou postar pra vc como esta... atualmente..

Model Responsáveis

namespace App\Model\Table;
use Cake\ORM\Table;

class ResponsaveisTable extends Table {


    public function initialize(array $config) {
        parent::initialize($config);

        $this->hasMany('Telefones',[
            'foreignKey'=>'responsavel_id'
        ] 
                );
    }

}

Model Telefones

namespace App\Model\Table;

use Cake\ORM\Table;

class TelefonesTable extends Table {

    public function initialize(array $config) {
        parent::initialize($config);

        $this->belongsTo('Responsaveis', [
            'foreignKey' =>'responsavel_id',
            'joinType' => 'INNER'
        ]);
    }

}

estou recebendo os dados do mesmo formulário e gravando no meu ResponsaveisController:

 public function cadastrarResponsavel($id){
        $dados = $this->request->data();
        $dados['id_user'] = $this->Auth->user('id_user');
       //print_r($dados);

       $responsaveisTable = TableRegistry::get('Responsaveis');
       $responsavel = $responsaveisTable->newEntity($dados);

       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');
    }

So que so grava o Responsavel o Telefone não grava

Alguem poderia me ajudar?

Opa, perdão pela demora!

Aqui você encontra um tutorialzinho bem legal da cake explicando um pouco de persistencia de entidades com relacionamento!

Mas, acredito que esteja faltando alguma coisa aqui no nosso cadastrarResponsavel! Nesse método, a gente pega os dados, e cria um Responsavel, certo?

Entretanto, precisamos também pegar os telefones dele! Algo como:

// precisamos resgatar o telefone do form:
    $telefones = $dados['telefone'];
     $telefonesTable = TableRegistry::get('Telefones');
       $telefones = $telefonesTable->newEntity($telefones);
// e relacionar os telefones ao responsavel!
    $responsavel->telefones = $telefones;    
// agora podemos salvar o responsavel, e os telefones serão salvos junto
       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');
    }

Qualquer dificuldade, compartilha com a gente!

Abraço e bons estudos =)

fiz as alterações quando dou um print em $dados o telefone esta recebendo normal:

Array ( [id_responsavel] => [nome] => Abv [cpf] => 333.333.333-33 [rg] => 111 [dt_nascimento] => Array ( [year] => 2017 [month] => 05 [day] => 09 ) [possui_filho] => N [cep] => 37.006-040 [rua] => Rua Brasília [numero] => 32 [complemento] => [bairro] => Parque Catanduvas [cidade] => Varginha [estado] => MG [telefones] => Array ( [telefone] => 23232 ) [id_user] => 7 )

ele esta dando erro na linha onde passo o telefone para a variavel $telefones, não esta passando o telefone:

Notice (8): Undefined index: telefone [APP/Controller\ResponsaveisController.php, line 26]

Método:

 public function cadastrarResponsavel(){

        $dados = $this->request->data();
        $dados['id_user'] = $this->Auth->user('id_user');
        //print_r($dados);

       $responsaveisTable = TableRegistry::get('Responsaveis');
       $responsavel = $responsaveisTable->newEntity($dados);

        $telefones = $dados['telefone'];
        print_r($telefones);
        $telefonesTable = TableRegistry::get('Telefones');
        $telefones = $telefonesTable->newEntity($telefones);

        //Relacionamento entre Responsaveis e Telefones
        $responsavel->telefones = $telefones;

       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'); 
    }

o problema do telefone nao receber resolvi fazendo assim:

$telefones = array('telefone'=>$dados['telefone']);

dai esta dando erro no relacionamento eu acho:

Could not save telefones, it cannot be traversed

Responsaveis Table:

<?php
namespace App\Model\Table;
use Cake\ORM\Table;

class ResponsaveisTable extends Table {


     public function initialize(array $config) {
        parent::initialize($config);

        $this->hasMany('Telefones');
    }

}

TelefonesTable:

<?php
namespace App\Model\Table;

use Cake\ORM\Table;

class TelefonesTable extends Table {

    public function initialize(array $config) {
        parent::initialize($config);

        $this->belongsTo('Responsaveis', [
            'foreignKey' =>'id_responsaveis',
            'joinType' => 'INNER'
        ]);
    }

}

O exemplo que eu deixei foi mais pra gente ver que precisamos relacionar as entidades, na documentação você encontra uma implementação mais fiel =)

Eu não sei o q eu estou arrumando que nao estou conseguindo nem a pau.. ja tentei varias vezes.. mas nao consigo entender...

Quais sao os requisitos para que o cake entenda o relacionamento e grave? Estou 4 dias por conta disso.. e nao vai...

Finalmente consegui! mas tem um detalhe... como faço pra receber varios telefones?

View:

<?= $this->Form->input('telefone', ['class'=>'form-control', 'label' => false) ?>
<?= $this->Form->input('telefone', ['class'=>'form-control', 'label' => false) ?>
<?= $this->Form->input('telefone', ['class'=>'form-control', 'label' => false) ?>

ResponsaveisTable:

<?php
namespace App\Model\Table;
use Cake\ORM\Table;

class ResponsaveisTable extends Table {


     public function initialize(array $config) {
        parent::initialize($config);

        $this->hasMany('Telefones',[
            'foreignKey'=>'id_responsavel'
        ]);

    }

}

TelefonesTable:

<?php
namespace App\Model\Table;

use Cake\ORM\Table;

class TelefonesTable extends Table {

    public function initialize(array $config) {
        parent::initialize($config);

        $this->belongsTo('Responsaveis');

    }

}

ResponsaveisController:

<?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(){

        $dados = $this->request->data();
        $dados['id_user'] = $this->Auth->user('id_user');
        //print_r($dados);

       $responsaveisTable = TableRegistry::get('Responsaveis');
       $responsavel = $responsaveisTable->newEntity($dados);

        //print_r($telefones);

        $telefone= $responsaveisTable->Telefones->newEntity();
        $telefone->telefone = $dados['telefone'];

        $responsavel->telefones = [$telefone];

       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'); 
    }

}