Cake PHP Relationship - 3 Tables

4

I have the following 3 tables:

Status Table:

id
nomeEstado

City Table:

id
idEstado //(que busca da tabela estado)
nomeCidade

Participant Table:

id
Nome
idCidade

Now I want to put in page Nome , Cidade and Estado , but I can not. I only get Nome and Cidade , Estado does not search.

How to do the relationship between 3 tables?

    
asked by anonymous 31.08.2014 / 20:07

1 answer

4

Create three Models in the app/Model folder in your CakePHP application.

Note: Class name is the same name as the file, that is, class Estado generates a Estado.php file, and so on. Do not forget to extend ( extends ) of AppModel . All relationships followed the CakePHP Framework website .

1) Model Settings:

    $ userTable = table name

2) Relationships:

Only $hasMany is used which is 1 for many and $belongsTo which is many for 1, and within the arrays the configurations:

  • className = name of the class that matches.

  • foreignKey = foreign key name,

There are standard conventions, but I particularly prefer to put mine.

Classes Model:

<?php
//Tabela "Estado" id nomeEstado
class Estado extends AppModel {
    public $name       = 'estado';
    public $useTable   = 'estado';      
    public $primaryKey = 'id';      
    public $hasMany = array('Cidade' => array('className' => 'Cidade','foreignKey' => 'idEstado'));
}
<?php
//Tabela "Cidade" id idEstado (que busca da tabela estado) nomeCidade
class Cidade extends AppModel {
    public $name       = 'cidade';
    public $useTable   = 'cidade';      
    public $primaryKey = 'id';      
    public $belongsTo = array('Estado' => array('className' => 'Estado', 'foreignKey' => 'idEstado'));
    public $hasMany = array('Participante' => array('className' => 'Participante','foreignKey' => 'idCidade'));
}
<?php
//Tabela "Participante" id Nome id_Cidade
class Participante extends AppModel {
    public $name       = 'participante';
    public $useTable   = 'participante';        
    public $primaryKey = 'id';
    public $belongsTo = array('Cidade' => array('className' => 'Cidade', 'foreignKey' => 'idCidade'));
}

Test generated with the classes were successful with the code and figures just below:

foreach($this->Estado->find('all') as $row){
    printf('<p>%s %s</p>', $row['Estado']['id'],$row['Estado']['nomeEstado']);
}

foreach($this->Cidade->find('all') as $row){
    printf('<p>%s  %s  %s %s</p>', $row['Cidade']['id'],
                           $row['Cidade']['nomeCidade'],
                           $row['Estado']['id'],
                           $row['Estado']['nomeEstado']);
}

//var_dump($this->Participante->find('all'));
foreach($this->Participante->find('all') as $row){
    printf('<p>%s %s %s  %s</p>', 
                           $row['Participante']['id'],
                           $row['Participante']['nome'],
                           $row['Cidade']['id'],
                           $row['Cidade']['nomeCidade']);
}

Regardingyourquestion,youshouldsetupavariableoftypearraywiththeoptionsascodebelow:

$options=array('joins'=>array(array('table'=>'estado','alias'=>'Estado','type'=>'INNER','conditions'=>array('Estado.id=Cidade.idEstado'))),'fields'=>array('Participante.*','Cidade.*','Estado.*'));foreach($this->Participante->find('all',$options)as$row){printf('<p>%s%s%s%s%s</p>',$row['Participante']['id'],$row['Participante']['nome'],$row['Cidade']['id'],$row['Cidade']['nomeCidade'],$row['Estado']['nomeEstado']);}

In this link there are more examples.

    
01.09.2014 / 01:43