Alguem pode me ajuda com esta consulta

Tenho 3 tabela:

Tabela Cidade

id, Cidade, UF

model: ‘regiao’ => array(self::HAS_MANY, ‘Regiao’, ‘idcidade’),

Tabela Regiao

id, idrepresentante, idcidade

model: ‘representante’ => array(self::BELONGS_TO, ‘Representante’, ‘idrepresentante’),

   'cidade' => array(self::BELONGS_TO, 'Cidade', 'idcidade'),

Tabela Representante

id, nome, endereco

model: ‘regiaos’ => array(self::HAS_MANY, ‘Regiao’, ‘idrepresentante’),

   'telefones' => array(self::HAS_MANY, 'Telefone', 'idrepresentante'),

Tabela Telefone

id, telefone, idreprentante

model: ‘representante’ => array(self::BELONGS_TO, ‘Representante’, ‘idrepresentante’),

Entao um representante pode representar varias cidades e um represente pode ter varios telefone. Mais o dado principal da consulta é UF, pois a ideia é lista todos os representante que pertence aquele estado desta forma:

* Regiao: botucatu, bauru, marilia


  Telefone: (19) 8888-9999 / (19) 9999-3333 - Reginaldo


  E-mail: conquistarepres@ig.com.br
  • Regiao: sao paulo, ibitinga, ourinhos

    Telefone: (19) 4444-4444 / (19) 944-3433 - Marcos

    E-mail: marcos@ig.com.br

Estou tentando fazer esta consulta em ajax, so que a minha ideia é fazer varias consulta ate chegar o resultado, entao gostaria que vcs me ajuda-se a simplificar a consulta chegando a ao mesmo resultado de uma rapida e de poucas linhas.

Agradeço

Se entendi bem, seria o seguinte:

Em representante, adicionar a seguinte relacao

Tabela Representante

‘cidades’ => array(self::MANY_MANY, ‘Cidade’, ‘Regiao(id_presentante, id_cidade)’, ‘alias’ => ‘cidades’),

Consulta:




$models = representante::model()->with(array('cidades', 'telefones'))->together()->findAll(array('condition' => 'cidades.uf = :uf', 'params' => array('uf' => $_GET['uf'])));


foreach($models as $model){

	echo "Regiao: ".implode(", ", CHtml::listData($model->cidades, 'id', 'Cidade'));

	echo "Telefone: ".implode(" / ", CHtml::listData($model->telefones, 'id', 'telefone'));

	echo "Nome: ".$model->nome;

	echo "Email: ".$model->email;

}




Meu brother valew mesmo funcionou certinho…

Mais vc poderia me explicar o codigo para eu ententer, o que vc fez… me parece que vc fez uma join sou muito leigo com o yii a respeito de join li reli mais nao entendi a documentacao… Poderia me explicar por passo da programaçao o que vc fez…

Mais desde ja agradeço muito.

Para entender bem, o ideal mesmo é ler a parte da documentação sobre ‘Relational Active Record’ e se focar à figura 1.4

Mas vou tentar explicar:

A sua tabela de região funciona como tabela "intermediária", tendo como função relacionar Representantes e Cidades.

Quando esta relação necessita uma tabela intermediária (Regiao), temos aí um relacionamento do tipo

MUITOS-PARA_MUITOS (MANY_MANY).

Sua consulta vai ser por UF, que está na tabela Cidade.

Se vc vai listar por Representante, então vc tem que obter as Cidades dos representantes para filtrar as UFs.

Entao, declaramos a relação MANY_MANY em Representantes




'cidades' => array(self::MANY_MANY, 'Cidade', 'Regiao(id_presentante, id_cidade)', 'alias' => 'cidades'),



Isso declara em REPRESENTANTE uma relação CIDADES, do tipo MUITOS_PARA_MUITOS, ligando Representante à tabela CIDADE,

utilizando como tabela de ligação (intermediária) a tabela REGIAO, que liga as duas tabelas através das chaves

ID_REPRESENTANTE e ID_CIDADE. A relação terá alias de CIDADES, para evitar ambiguidades.

Agora, a consulta em si.




$models = representante::model()->with(array('cidades', 'telefones'))->together()->findAll(array('condition' => 'cidades.uf = :uf', 'params' => array('uf' => $_GET['uf'])));



Seleciona todos os representantes, juntando as CIDADES e os TELEFONES dos representantes,

definindo como condição que as UF das cidades relacionados seja igual ao parâmetro UF utilizado.

O together é indispensável porque a consulta sobre UF é feita em tabela relacionada ao Representante.

A exibição:


 

foreach($models as $model){

        echo "Regiao: ".implode(", ", CHtml::listData($model->cidades, 'id', 'Cidade'));

        echo "Telefone: ".implode(" / ", CHtml::listData($model->telefones, 'id', 'telefone'));

        echo "Nome: ".$model->nome;

        echo "Email: ".$model->email;

}



A função listData formata os modelos obtidos em formato de array, tendo a cidade ou o telefone como conteúdo.

A função implode obtém esses arrays e concatena os textos separando-os por virgulas ou barras.