Cake PHP Relationship - 3 Tables

Asked

Viewed 1,925 times

4

I have the following 3 tables:

Table State:

id
nomeEstado

Table City:

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

Participating Table:

id
Nome
idCidade

Now I want to put on the page Nome, Cidade and Estado, but I’m not getting it. I can only Nome and Cidade, the Estado not seeking.

How to make the relationship between 3 tables?

  • Hello, welcome to [en.so]. Please include the code you are using, it’s just [Edit] the question. Check out the [Ask] guide for more details.

  • 1

    Your question is a little confused. Try to rework it.

  • @Alessandro, in the table Participants I put idCidade without the _ to follow the same nomenclature of the others (was id_Cidade, then standardized) and in the example I posted has all the explanation and in the last item the solution. Enjoy!

1 answer

4


Create three Models in the folder app/Model in its application Cakephp.

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

1) Model Settings:

  • $userTable = table name

  • $primaryKey = primary key name.

2) Relationships:

Have only been used $hasMany which is 1 for many and $belongsTo which is many for 1, and within the arrays the settings:

  • classname = name of the matching class.

  • foreignKey = foreign key name,

There are standard conventions, but particularly I 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']);
}

inserir a descrição da imagem aqui


For your doubt you must assemble a variable of type array with the options as code below:

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

inserir a descrição da imagem aqui

In that link there are more examples.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.