HUFERSIL.WEBDEVELOPER

Lumine – Sub-Select

Muitas pessoas tem me perguntado como se fazer sub-select utilizando Lumine.
De uma forma simples, hoje Lumine não tem suporte a sub-select’s, mas você pode fazê-la de outras formas.

Hoje vou mostrar de duas formas: uma utilizando in e not in e outra com concatenação de strings.

Utilizando in / not in

Neste exemplo, funciona de forma semelhante a uma sub-select, porém na verdade serão executadas duas consultas, como o exemplo abaixo:

// encontra todos os grupos que tenham admin
$grupo->select('idgrupo')
   ->where('nome like "%admin%"')
   ->find();

// pega todos os usuarios dos grupos relacionados
$user->alias('u')
  ->where('u.idgrupo in (?)', $grupo)
  ->find();

Lumine irá pegar a primeira coluna do resultado da consulta do objeto $grupo para compor os elementos que serão passados para o filtro in, assim o usuário não precisa criar mais um laço de iteração para poder pegar as colunas e colocar no filtro in de sua consulta. Ele também funciona para not in.

Concatenando strings

Nesta forma sim, será executada uma sub-select. Mas como Lumine não identifica (ainda) como a sub-select deve ser feita, é necessário que seja recuperada a consulta que seria executada e concatenar na string que será enviada para o objeto de conexão.

Exemplo:

// primeiro, pegamos um objeto de pagamento
$pgt = new Pagamento;
// colocamos as condicoes. Veja que tambem usamos o alias u, mas sem fazer o join com nada
$pgt->alias('p')
  ->where('p.pago = 0 AND p.idusuario = u.idusuario');

// pegamos a SQL de contagem
$sql = $pgt->_getSQL(Lumine_Base::SQL_SELECT_COUNT, '*');
// agora, concatenamos em um objeto de usuario
$user = new Usuario;
// mudamos o alias de usuario. Veja que eh o mesmo usado na criacao da consulta anterior
$user->alias('u')
  // pegamos todos os campos...
  ->selectAs()
  // adicionamos a sub-select
  ->select('(' . $sql . ') as "pagamentosPendentes"')
  // efetuamos a consulta
  ->find();

Sei que dessa forma fica um pouco mais complexo do que a forma tradicional, porém você conta com todos os recursos de Lumine para poder montar a consulta para você (por exemplo: prepared statements, joins, abstração do nome da tabela).
Estou trabalhando em várias melhorias no Lumine, e Sub-Select está dentre uma delas.

Qualquer dúvida, ou sugestão, entre em contato ou enviem um comentário.

@braços e fiquem com Deus!  

 

Deixar uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *

*

Pode usar estas etiquetas HTML e atributos: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="" highlight="">