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!