join Sex, 01 de fevereiro de 2008 - as 21h18
$obj->join( Lumine_Base $obj, [String $type = 'INNER' [, String $alias = '' [, String $linkName = null [, String $linkTo = null [, $extraCondition = null [, $arg1 [, $arg2 ... ]]]]]]]);
Este foi um dos métodos que mais sofreu alteração nesta versão de Lumine, assim como where.
Possibilita a união de duas ou mais entidades. Por exemplo:
// nova pessoa
$pessoa = new Pessoa;
// endereco
$endereco = new Endereco;
// novo telefone
$telefone = new Telefone;
// une pessoa com endereco
$pessoa->join($endereco);
// une pessoa com telefone
$pessoa->join($telefone);
// efetua a consulta
$total = $pessoa->find();
A consulta a ser efetuada será semelhante a esta:
SELECT * FROM pessoa INNER JOIN endereco ON(pessoa.idpessoa=endereco.idpessoa) INNER JOIN telefone ON(cliente.idpessoa =telefone.idpessoa )
O método de união padrão deste método é INNER. Para alterá-lo, coloque como segundo argumento na chamada, por exemplo:
$lista->join($telefone, 'LEFT');
O terceiro argumento deste método, é para utilizar um apelido (alias) para a entidade, por exemplo:
$lista->join($telefone,'INNER', 'tel');
// agora podemos acrescentar pelo apelido, no select
$lista->select('tel.ddd, tel.numero');
Quando você NÃO deseja realizar a união definida nos mapeamentos, você pode especificar os parametros $linkName e $linkTo. O primeiro, refere-se ao membro da classe chamadora, o segundo, à classe que está sendo unida.
$lista = new Usuario;
$venda = new Venda;
$lista->alias('u')
->join($venda, 'INNER', 'v', 'codusuario', 'usuario') // lembre-se que estamos usando o MEMBRO, não a coluna
->select('u.codusuario, u.nome, count(v.codvenda) as total')
->find();
Ainda existe a possibilidade de você adicionar condições extras para o JOIN. O padrão, é fazer a comparação entre dois membros. Se quiser adicionar mais condições, utilize o parâmetro $extraCondition
// assim, esta consulta irá verificar quantas compras cada usuario fez antes de 01/01/2008
$lista->alias('u')
->join($venda,'LEFT','v',null,null,'v.datavenda <= ?', '2008-01-01')
->select('u.nome, count(v.codvenda) as total')
->find();