Find em Multiplos Modelos com campo calculado

21 views
Skip to first unread message

Celso

unread,
Nov 4, 2009, 8:17:18 AM11/4/09
to Cake PHP Português
*Olá Galera!
*Estou com esse modelo:

http://picasaweb.google.com.br/celsowm/Screenshots#5399915797002091778

*E preciso recuperar isto:

Proprietario.nome , Veiculo.placa , sum (Infracoes.pontuacao) as
pontos


Proprietario "hasMany" Veiculo
Veiculo "habBelongsToMany" Infracoes

*Queria algo assim:

SELECT Veiculo.placa, Proprietario.nome, sum(Infracao.pontuacao) as
pontos FROM proprietarios AS Proprietario

LEFT JOIN veiculos AS Veiculo ON (Veiculo.proprietario_id =
Proprietario.id)

LEFT JOIN multas AS Multa ON (Multa.veiculo_id = Veiculo.id)

LEFT JOIN infracoes AS Infracao ON (Infracao.id = Multa.infracao_id


*Eu tentei várias coisa como cointainable e recursive, mas parece que
a única solução será montar os joins no array

Valeu comunidade Brazuca,
Att. Celso

Gabriel Gilini

unread,
Nov 4, 2009, 11:35:50 AM11/4/09
to cake-...@googlegroups.com
2009/11/4 Celso <cel...@gmail.com>:

>
> *Olá Galera!
> *Estou com esse modelo:
>
> http://picasaweb.google.com.br/celsowm/Screenshots#5399915797002091778
>
> *E preciso recuperar isto:
>
>     Proprietario.nome , Veiculo.placa , sum (Infracoes.pontuacao) as
> pontos
>
>
> Proprietario "hasMany" Veiculo
> Veiculo "habBelongsToMany" Infracoes

E Multa?

> *Queria algo assim:
>
> SELECT Veiculo.placa, Proprietario.nome, sum(Infracao.pontuacao) as
> pontos FROM proprietarios AS Proprietario
>
> LEFT JOIN veiculos AS Veiculo ON (Veiculo.proprietario_id =
> Proprietario.id)
>
> LEFT JOIN multas AS Multa ON (Multa.veiculo_id = Veiculo.id)
>
> LEFT JOIN infracoes AS Infracao ON (Infracao.id = Multa.infracao_id

OK

> *Eu tentei várias coisa como cointainable e recursive, mas parece que
> a única solução será montar os joins no array

E qual o problema? Você não mostrou *o que deu errado* nem *o que você
tá fazendo*.

--
Gabriel Gilini

www.usosim.com.br
gab...@usosim.com.br

Mauro Thiago

unread,
Nov 4, 2009, 11:42:16 AM11/4/09
to cake-...@googlegroups.com
Creio que esteja faltando campos no Proprietário, pois ambas as tables necessitam do campos para trabalhar.
A Table Proprietário necessita de um campo como FK (chave estrageira) para receber o id da Pessoa Fisica / Juridica e Id do Veiculo.

Thiago

2009/11/4 Gabriel Gilini <gab...@usosim.com.br>

Celso

unread,
Nov 4, 2009, 1:48:36 PM11/4/09
to Cake PHP Português
Desculpem a falta de mais detalhes, mas acho que descobri um BUG no
containable:

***Funciona (sem "sum")

$this->Proprietario->Behaviors->attach('Containable');
$this->Proprietario->find('all', array(
'contain'=>array(
'Veiculo' => array(
'Infracao' => array (
'fields' => array('(Infracao.id) as
pontos')
)
)
),
)
);

***Não funciona (com "sum"):

$this->Proprietario->Behaviors->attach('Containable');
$this->Proprietario->find('all', array(
'contain'=>array(
'Veiculo' => array(
'Infracao' => array (
'fields' => array('sum(Infracao.id) as
pontos')
)
)
),
)
);


Neste segundo caso ele meio que ignora o "$useTable" e dá o erro:

Notice (8): Undefined index: Infracaos [CORE\cake\libs\model
\datasources\dbo_source.php, line 1012]

***Não é a primeira vez que tenho problemas com campos calculados no
CAKE...



On 4 nov, 13:42, Mauro Thiago <maurothi...@gmail.com> wrote:
> Creio que esteja faltando campos no Proprietário, pois ambas as tables
> necessitam do campos para trabalhar.
> A Table Proprietário necessita de um campo como FK (chave estrageira) para
> receber o id da Pessoa Fisica / Juridica e Id do Veiculo.
>
> Thiago
>
> 2009/11/4 Gabriel Gilini <gabr...@usosim.com.br>
>
>
>
> > 2009/11/4 Celso <cels...@gmail.com>:
>
> > > *Olá Galera!
> > > *Estou com esse modelo:
>
> > >http://picasaweb.google.com.br/celsowm/Screenshots#5399915797002091778
>
> > > *E preciso recuperar isto:
>
> > >     Proprietario.nome , Veiculo.placa , sum (Infracoes.pontuacao) as
> > > pontos
>
> > > Proprietario "hasMany" Veiculo
> > > Veiculo "habBelongsToMany" Infracoes
>
> > E Multa?
>
> > > *Queria algo assim:
>
> > > SELECT Veiculo.placa, Proprietario.nome, sum(Infracao.pontuacao) as
> > > pontos FROM proprietarios AS Proprietario
>
> > > LEFT JOIN veiculos AS Veiculo ON (Veiculo.proprietario_id =
> > > Proprietario.id)
>
> > > LEFT JOIN multas AS Multa ON (Multa.veiculo_id = Veiculo.id)
>
> > > LEFT JOIN infracoes AS Infracao ON (Infracao.id = Multa.infracao_id
>
> > OK
>
> > > *Eu tentei várias coisa como cointainable e recursive, mas parece que
> > > a única solução será montar os joins no array
>
> > E qual o problema? Você não mostrou *o que deu errado* nem *o que você
> > tá fazendo*.
>
> > --
> > Gabriel Gilini
>
> >www.usosim.com.br
> > gabr...@usosim.com.br
>
>

Desenvolvimento SiscoJ

unread,
Nov 4, 2009, 2:07:50 PM11/4/09
to cake-...@googlegroups.com
Por acaso isso resultou em uma query montada de forma correta?
Só por desencargo....

att.


2009/11/4 Celso <cel...@gmail.com>:

Celso

unread,
Nov 4, 2009, 3:51:03 PM11/4/09
to Cake PHP Português
ele montou essas querys sem erros:

SELECT `Proprietario`.`id`, `Proprietario`.`nome`,
`Proprietario`.`endereco`, `Proprietario`.`email`,
`Proprietario`.`idade` FROM `proprietarios` AS `Proprietario` WHERE 1
= 1

SELECT `Veiculo`.`id`, `Veiculo`.`placa`, `Veiculo`.`proprietario_id`
FROM `veiculos` AS `Veiculo` WHERE `Veiculo`.`proprietario_id` IN (1,
3, 5, 6, 7, 9, 10, 13, 15, 16, 17, 18, 19, 25, 26, 27, 36, 42, 43, 44,
45, 46, 48, 51, 55, 56, 57, 58, 59, 60, 61, 62, 63, 65, 66, 67, 68,
69, 70)

SELECT sum(pontuacao) as pontos, `Multa`.`id`, `Multa`.`veiculo_id`,
`Multa`.`infracao_id`, `Multa`.`data`, `Multa`.`local` FROM
`infracoes` AS `Infracao` JOIN `multas` AS `Multa` ON
(`Multa`.`veiculo_id` IN (4, 6, 8, 11, 13, 15, 20, 21) AND
`Multa`.`infracao_id` = `Infracao`.`id`) WHERE 1 = 1

**Quando eu tiro os fields, eu consigo um array assim:

Array
(
[0] => Array
(
[id] => 6
[placa] => GAY-2424
[proprietario_id] => 1
[Infracao] => Array
(
[0] => Array
(
[id] => 7
[nome] => Estacionar o veículo em
desacordo com as condições regulamentadas especificamente pela
sinalização.
[pontuacao] => 3
[Multa] => Array
(
[id] => 1
[veiculo_id] => 6
[infracao_id] => 7
[data] => 2009-10-22
[local] => u ghg
)

)


Vou simular via php um "SUM" (vendo quando ocorrências tem no array de
infracao) acho que o jeito.


On 4 nov, 16:07, Desenvolvimento SiscoJ <siscoj...@gmail.com> wrote:
> Por acaso isso resultou em uma query montada de forma correta?
> Só por desencargo....
>
> att.
>
> 2009/11/4 Celso <cels...@gmail.com>:

Edinei Luis Cipriani

unread,
Nov 4, 2009, 4:03:00 PM11/4/09
to cake-...@googlegroups.com
Quando vc coloca o SUM, como ele monta a query?

Você pode usar parametros no model para isso tbém.

Desenvolvimento SiscoJ

unread,
Nov 4, 2009, 4:10:02 PM11/4/09
to cake-...@googlegroups.com
putz... deu minha hora...
veja se isso ajuda:

http://osdir.com/ml/CakePHP/2009-10/msg00000.html

parece q o cake nao adiciona o atributo no model....

ae tem q seguir esse caminho:
http://teknoid.wordpress.com/2008/09/29/dealing-with-calculated-fields-in-cakephps-find/

att.


2009/11/4 Celso <cel...@gmail.com>:
>
> ele montou essas querys sem erros:
>
> SELECT `Proprietario`.`id`, `Proprietario`.`nome`,
> `Proprietario`.`endereco`, `Proprietario`.`email`,
> `Proprietario`.`idade` FROM `proprietarios` AS `Proprietario` WHERE 1
> = 1
>
> SELECT `Veiculo`.`id`, `Veiculo`.`placa`, `Veiculo`.`proprietario_id`
> FROM `veiculos` AS `Veiculo` WHERE `Veiculo`.`proprietario_id` IN (1,
> 3, 5, 6, 7, 9, 10, 13, 15, 16, 17, 18, 19, 25, 26, 27, 36, 42, 43, 44,
> 45, 46, 48, 51, 55, 56, 57, 58, 59, 60, 61, 62, 63, 65, 66, 67, 68,
> 69, 70)ra...

Edinei Luis Cipriani

unread,
Nov 4, 2009, 4:22:32 PM11/4/09
to cake-...@googlegroups.com
Pq não faz veiculos_ifracoes ?
Reply all
Reply to author
Forward
0 new messages