Ajuda com ORM

17 views
Skip to first unread message

Douglas Fonseca dos Santos

unread,
Nov 28, 2012, 1:54:48 PM11/28/12
to kohan...@googlegroups.com
Bom dia a todos,

Estou encontrando um problema para fazer umas query's no Kohana 3.2.

Primeiro, eu preciso fazer uma subquery, gostaria de saber se existe uma forma usando apenas o ORM (sem utilizar o DB::select).

Segundo, existe alguma forma de se fazer um AND no ON de um JOIN (tipo SELECT * FROM table1 INNER JOIN table2 ON table1.campo1 = table2.campo1 AND table1.campo2 = table2.campo2).

Agradeço a atenção,

Atenciosamente,
Douglas Santos.

felipe bastos

unread,
Nov 28, 2012, 2:14:46 PM11/28/12
to kohan...@googlegroups.com

Douglas, uma correcao ..

Join ...... On .......

Where ....... and .......

No mais .. veja se é possivel ... orm::factory().select(tb1.*, tb2.*).from().join().where().find_all() .. nao lembro se é possivel.

Mas, encare o ORM como um mapeamento. Se seu mapeamento tras o resultado de 2 tabelas, ja pensou em criar uma view no banco e usar o orm so pra consultas?

E, nao veja usar DB como um problema. Ele serve para isso .. o orm é apenas uma camada superior a DB

--
Você está recebendo esta mensagem porque se inscreveu no grupo "Kohana Php" dos Grupos do Google.
Para ver esta discussão na web, acesse https://groups.google.com/d/msg/kohana-php/-/RwKyW2lBJ4YJ.
Para postar neste grupo, envie um e-mail para kohan...@googlegroups.com.
Para cancelar a inscrição nesse grupo, envie um e-mail para kohana-php+...@googlegroups.com.
Para obter mais opções, visite esse grupo em http://groups.google.com/group/kohana-php?hl=pt-BR.

jose antoniel de lima Lima

unread,
Nov 28, 2012, 2:26:05 PM11/28/12
to kohana-php
com ORM é possivel fazer isso ai para retornar dados apenas de 1 modelo:

        ORM::factory('table1')
                ->join(DB::expr('table2 AS table2'))
                ->on('table1.campo1', '=', 'table2.campo1')
                ->where('table1.campo2','=','table2.campo2')
                ->find_all();

OBS: table1 é o nome do modelo que sera retornado.
table2 é nome da tabela que será feita a JOIN.



lembrando JOIN no ORM traz dados apenas de 1 modelo, no exemplo table1.

--
Atenciosamente,
José Antoniel de Lima
Analista de Sistemas PHP5

Douglas Fonseca dos Santos

unread,
Nov 28, 2012, 2:39:23 PM11/28/12
to kohan...@googlegroups.com
Quanto à primeira questão, eu não tenho nenhum problema em usar o DB::select pra fazer a subquery, só queria saber se existe algum jeito de fazer a mesma coisa com o ORM, não faz muito tempo que eu uso o Kohana e não sei se existe forma melhor de fazer o que eu faço, mas com o DB::select funciona de boa.

Quanto a segunda questão, eu precisava fazer uma query como a desse link

http://dev.mysql.com/doc/refman/5.0/en/example-maximum-column-group-row.html

Mais especificamente algo bem parecido com essa query:

SELECT s1.article, dealer, s1.price
FROM shop s1
JOIN (
  SELECT article, MAX(price) AS price
  FROM shop
  GROUP BY article) AS s2
  ON s1.article = s2.article AND s1.price = s2.price;

Eu nem pensei em usar a clausa WHERE, mas acho que com WHERE funciona do mesmo jeito.

Muito obrigado pela atenção,

Atenciosamente,
Douglas Santos.

jose antoniel de lima Lima

unread,
Nov 28, 2012, 2:45:48 PM11/28/12
to kohana-php
$sql = "(
  SELECT article, MAX(price) AS price
  FROM shop
  GROUP BY article) AS s2";

ORM::factory('table1')
          ->join(DB::expr($sql))
          ->on('table1.campo1', '=', 'table2.campo1')
          ->where('table1.campo2','=','table2.campo2')
          ->find_all();


acho que isso da certo não testei.

felipe bastos

unread,
Nov 28, 2012, 3:08:00 PM11/28/12
to kohan...@googlegroups.com

Flw,

Mas ON é usado para chaves .. este exemplo so esta correto semanticamente se price for uma chave indexada .. nao sendo, prefira usar where.

Douglas Fonseca dos Santos

unread,
Nov 28, 2012, 3:28:42 PM11/28/12
to kohan...@googlegroups.com
Eu usei o próprio DB::select para montar a query, tipo:

$sql = DB::select('article', array(DB::expr('MAX(price)', 'price'))->from('shop')->group_by('article');

ORM::factory('shop')->join(array($sql, 's2'))->ON('shop.article', '=', 's2.article')->where('shop.price', '=', 's2.price');

e funcionou.

Não usei uma chave no ON por que não consigo construir uma query que me dê a chave correta, se alguém tiver uma sugestão eu agradeceria enormemente.

Atenciosamete,
Douglas Santos.

felipe bastos

unread,
Nov 28, 2012, 5:46:00 PM11/28/12
to Kohana Php
Blz man ..

e esse ON é onde?
Reply all
Reply to author
Forward
0 new messages