Filtro no controller

7 views
Skip to first unread message

Benício Júnior

unread,
Jun 18, 2009, 10:48:45 AM6/18/09
to CakePHP Tuga
Olá amigos,

Estou com uns problemas no Cake. Vou exemplificar somente com duas
tabelas do que necessito: tipos (id, descricao) e subtipos (id,
descricao, tipo_id). O que eu quero é que sejam exibidas os subtipos
agrupados por tipos, só que eu estou utilizando a pages_controller.php
pra setar as variaveis e exibindo na default.ctp. Segue abaixo um
trecho dos códigos que eu tou usando.

pages_controller.php

$this->set("tipos",$this->Tipo->find('all',array('order' =>
'Tipo.descricao ASC','fields' => array('Tipo.id',
'Tipo.descricao'))));

$this->set("subtipos",$this->Tipo->Subtipo->find('all',array(NULL,
'fields' => array('Subtipo.id', 'Subtipo.descricao',
Subtipo.tipo_id),'order' => array('Subtipo.descricao ASC'))));

default.ctp

php foreach ($tipos as $tipo):
echo $html->link($tipo['Tipo']['descricao'],'#');
php foreach ($subtipos as $subtipo):
echo $html->link($subtipo['Subtipo']['descricao'],'#');
php endforeach;
php endforeach;

Dá forma que está sendo exibida vem todas os subtipos dentro de cada
tipo e não especifica. Consegui resolver o problema colocando um IF
dentro da default.ctp e checando o id com tipo_id somente para testar
e funcionou. Mas preciso fazer de uma forma correta e sem POG já que
vou precisar de mais rotinas semelhantes. Tentei fazer como um exemplo
de cidades e estados

$this->set("subtipos",$this->Tipo->Subtipo->find('all',array
('conditions' => array('Subtipo.tipo_id' => $this->data['Tipo']
['id']), 'fields' => array('Subtipo.id', 'Subtipo.descricao',
Subtipo.tipo_id),'order' => array('Subtipo.descricao ASC'))));

O resultado retornado é Subtipo.tipo_id IS NULL. Desde já agradeço a
ajuda da galera. Um abraço a todos

Cauan Cabral

unread,
Jun 19, 2009, 1:55:39 PM6/19/09
to cakep...@googlegroups.com
Benício, se entendi bem, o que você quer pode ser obtido usando GROUP BY do SQL.

Seria algo assim (não testei):

$this->set("subtipos",$this->Tipo->Subtipo->find('all',array(
'fields' => array('Subtipo.id', 'Subtipo.descricao',
Subtipo.tipo_id),'order' => array('Subtipo.descricao ASC'),
'group' => array('Subtipo.tipo_id'))));

2009/6/18 Benício Júnior <larsu...@gmail.com>

Benício Júnior

unread,
Jun 20, 2009, 10:13:55 AM6/20/09
to CakePHP Tuga
Olá Cauan,

Já consegui resolver e vou postar aqui caso mais alguém precise. Para
eu pegar as "ligações" existentes entre Tipo e Subtipo eu utilizei o
recursive igual a 2 pq tem mais uma ligação entre Subtipo e outro
model. Nessa caso que eu perguntei o recursive igual a 1 resolveria.

pages_controller.php

$this->Tipo->recursive = 2;
$this->set("tipos",$this->Tipo->find('all',array('order' =>
'Tipo.descricao ASC')));

O detalhe está na view onde eu coloco $tipo['Subtipo'] as $subtipo

php foreach ($tipos as $tipo):
echo $html->link($tipo['Tipo']['descricao'],'#');
php foreach ($tipo['Subtipo'] as $subtipo):
echo $html->link($subtipo['Subtipo']['descricao'],'#');
php endforeach;
php endforeach;

Sou iniciante com o Cake mas tou aí pra qualquer esclarecimento.
Abraço

On 19 jun, 14:55, Cauan Cabral <cau...@gmail.com> wrote:
> Benício, se entendi bem, o que você quer pode ser obtido usando GROUP BY do
> SQL.
> Seria algo assim (não testei):
>
> $this->set("subtipos",$this->Tipo->Subtipo->find('all',array(
> 'fields' => array('Subtipo.id', 'Subtipo.descricao',
> Subtipo.tipo_id),'order' => array('Subtipo.descricao ASC'),
> 'group' => array('Subtipo.tipo_id'))));
>
> 2009/6/18 Benício Júnior <larsuri...@gmail.com>
Reply all
Reply to author
Forward
0 new messages