Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

JCCA

[Resolvido] Relacionamento / Reuperação de dados

Recommended Posts

Pessoal tenho as seguintes tabelas relacionadas;

 

CREATE TABLE `horarios` (
 `id` smallint(6) NOT NULL,
 `modulo_id` smallint(6) NOT NULL,
 `turma` varchar(10) DEFAULT NULL,
 `periodo` varchar(30) DEFAULT NULL,
 `dia_semana` varchar(70) DEFAULT NULL,
 `horario` varchar(30) DEFAULT NULL,
 PRIMARY KEY (`id`),
 KEY `horario_modulo` (`modulo_id`),
 CONSTRAINT `horario_modulo` FOREIGN KEY (`modulo_id`) REFERENCES `modulos` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1


CREATE TABLE `modulos` (
 `id` smallint(6) NOT NULL,
 `identificador` varchar(20) NOT NULL,
 `descricao` varchar(60) NOT NULL,
 `tipo` char(1) DEFAULT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1

 

 

 

Segue abaixo seus modelos:

 

<?php

   class Horario {
       var $name = 'Horario';
       var $belongsTo = array('Modulo');
   }
?>

 

 

<?php

class Modulo extends AppModel{
   var $name = 'Modulo';
   var $hasMany = array('Horario') ;
}

?>

 

Quando tento recuperar os dados através do código:

 

        function index() {
           $this->set('modulos', $this->Modulos->find("all"));
}

 

E executando o comando:

 

    <?php print_r($modulos)?>

 

Ele me retorna o seguinte resultado, não exibindo os dados de horário, só os módulos:

 

Array ( [0] => Array ( [Modulos] => Array ( [id] => 1 [identificador] => bb [descricao] => Funcionamento do bb [tipo] => g ) ) [1] => Array ( [Modulos] => Array ( [id] => 3 [identificador] => teste [descricao] => Teste 01 [tipo] => p ) ) ) 

 

Qual será o problema?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tenta mudar o tipo de relacionamento. Geralmente só é preciso ter o relacionamento em um dos Models.

 

Não sei pq isso acontece, pela lógica o teu estaria correto, mas tenta mudar, tenho certeza que vai funcionar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tenta mudar o tipo de relacionamento. Geralmente só é preciso ter o relacionamento em um dos Models.

 

Não sei pq isso acontece, pela lógica o teu estaria correto, mas tenta mudar, tenho certeza que vai funcionar.

 

Cara!

 

Fiz uns testes neste sentido e não funcionou!

 

você teria algum exemplo aí funcionando pra eu testar?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Já sei onde está seu erro..

 

 

No Model horário, você deve estender a AppModel..

class Horario extends AppModel {
    //codigo
}

Mas por via de dúvidas...

 

 

Vou colocar aqui oq eu fiz com Estado - Cidades, que é parecido.

 

Model Cidade:

class Cidade extends AppModel {
	var $name = 'Cidade';			
	var $belongsTo = 'Estado';

}

 

OBS: ao invez de usar print_r, use pr(), é melhor.

 

A principio está parecido com o seu códio, estou usando os mesmos relacionamentos.. não consigo visualizar direito teu array, está tudo na mesma linha...

 

Model Estado:

class Estado extends AppModel {
	var $name = 'Estado';
	var $hasMany = 'Cidade';

Estados Controller:

function read() {
	pr($this->Estado->find('all'));
	$this->set('estados', $this->Estado->find('all'));
}

 

Array:

Array
(
    [0] => Array
        (
            [Estado] => Array
                (
                    [id] => 1
                    [estado] => Rio Grande do Sul
                    [uf] => RS
                )

            [Cidade] => Array
                (
                    [0] => Array
                        (
                            [id] => 22
                            [estado_id] => 1
                            [cidade] => Não-Me-Toque
                        )

                    [1] => Array
                        (
                            [id] => 23
                            [estado_id] => 1
                            [cidade] => Passo Fundo
                        )

                    [2] => Array
                        (
                            [id] => 24
                            [estado_id] => 1
                            [cidade] => Carazinho
                        )

                    [3] => Array
                        (
                            [id] => 25
                            [estado_id] => 1
                            [cidade] => Victor Graeff
                        )

                    [4] => Array
                        (
                            [id] => 26
                            [estado_id] => 1
                            [cidade] => Soledade
                        )

                )

        )

    [1] => Array
        (
            [Estado] => Array
                (
                    [id] => 2
                    [estado] => Santa Catarina
                    [uf] => SC
                )

            [Cidade] => Array
                (
                )

        )

    [2] => Array
        (
            [Estado] => Array
                (
                    [id] => 3
                    [estado] => São Paulo
                    [uf] => SP
                )

            [Cidade] => Array
                (
                )

        )

    [3] => Array
        (
            [Estado] => Array
                (
                    [id] => 4
                    [estado] => Goiás
                    [uf] => GO
                )

            [Cidade] => Array
                (
                    [0] => Array
                        (
                            [id] => 31
                            [estado_id] => 4
                            [cidade] => Goiânia
                        )

                )

        )

)

Compartilhar este post


Link para o post
Compartilhar em outros sites

É!! Realmente tinha tinha esquecido do extends, corrigi mas, continua dando este resultado:

 

Array
(
    [0] => Array
        (
            [Modulos] => Array
                (
                    [id] => 1
                    [identificador] => bb
                    [descricao] => Funcionamento
                    [tipo] => g
                )

        )

    [1] => Array
        (
            [Modulos] => Array
                (
                    [id] => 3
                    [identificador] => gg
                    [descricao] => gastos
                    [tipo] => p
                )

        )

)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vejo que você está chamando o model deste modo:

$this->set('modulos', $this->Modulos->find("all"));

(preste atenção no negrito)

Tente:

$this->set('modulos', $this->Modulo->find("all"));
E se não der:

$this->set('modulos', $this->Modulo[b]s[/b]->find("all", array('recursive' => 2)));

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você está trazendo os dados em qual controller?

 

<?php

   class ModulosController  extends AppController{
       var $name = "Modulos";
       var $uses = array("Modulos", "Horarios");

       function index() {
           $this->set('modulos', $this->Modulos->find("all"));

       }
  }
?>

 

Vejo que você está chamando o model deste modo:

$this->set('modulos', $this->Modulos->find("all"));

(preste atenção no negrito)

Tente:

$this->set('modulos', $this->Modulo->find("all"));
E se não der:

$this->set('modulos', $this->Modulo[b]s[/b]->find("all", array('recursive' => 2)));

Valeu!

tentei estas opções mas, deu o mesmo resultado!?!?!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara, mão tem mais muito o que mudar, pode ser que você setou a variavel $recursive no teu model como 0 e não esteja buscando os dados da outra tabela..

 

seta pra 2 ou 3 e ve o que acontece..

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você também está usando o Controller::$uses erroneamente, provavelmente será isso.

Troque disso:

var $uses = array("Modulos", "Horarios");
Para

var $uses = array("Modulo", "Horario");

E não se esqueça de utilizar $this->Modulo e não $this->Modulos

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você também está usando o Controller::$uses erroneamente, provavelmente será isso.

Troque disso:

var $uses = array("Modulos", "Horarios");
Para

var $uses = array("Modulo", "Horario");

E não se esqueça de utilizar $this->Modulo e não $this->Modulos

 

 

Ah, bem visto lucaswxp. Provavelmente esteja aí a resolução.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim, posta o código todo ATUALMENTE. (inclusive sql)

 

Segue:

modulos_controller.php

<?php

   class ModulosController  extends AppController{
       var $name = "Modulos";
       var $uses = array("Modulo", "Horario");

       function index() {
           $this->set('modulos', $this->Modulo->find("all",array('recursive' => 2)));
       }
 }
?>

 

Horario.php

<?php

   class Horario extends AppModel {
       var $name = 'Horario';
       var $belongsTo = array('Modulo');
   }
?>

 

Modulo.php

<?php

class Modulo extends AppModel{
   var $name = 'Modulo';
   var $hasMany = array('Horario') ;
}

?>

 

Tabelas:

 


CREATE TABLE `horarios` (
 `id` smallint(6) NOT NULL,
 `modulo_id` smallint(6) NOT NULL,
 `turma` varchar(10) DEFAULT NULL,
 `periodo` varchar(30) DEFAULT NULL,
 `dia_semana` varchar(70) DEFAULT NULL,
 `horario` varchar(30) DEFAULT NULL,
 PRIMARY KEY (`id`),
 KEY `horario_modulo` (`modulo_id`),
 CONSTRAINT `horario_modulo` FOREIGN KEY (`modulo_id`) REFERENCES `modulos` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1


CREATE TABLE `modulos` (
 `id` smallint(6) NOT NULL,
 `identificador` varchar(20) NOT NULL,
 `descricao` varchar(60) NOT NULL,
 `tipo` char(1) DEFAULT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1

 

Resultado após chamada ao link:

http://localhost/CakePHP2/modulos

 

Array
(
    [0] => Array
        (
            [Modulos] => Array
                (
                    [id] => 1
                    [identificador] => bb
                    [descricao] => Funcionamento
                    [tipo] => g
                )

        )

    [1] => Array
        (
            [Modulos] => Array
                (
                    [id] => 3
                    [identificador] => gg
                    [descricao] => gastos
                    [tipo] => p
                )

        )

)

Compartilhar este post


Link para o post
Compartilhar em outros sites

O nome do teu Model está com letra maiúscula?

 

Se estiver, coloque minuscula.. horario.php, modulo.php

 

beleza!!!

 

Agora foi!!

 

Obrigado a todos!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.