[SP-pm] DBIx::Class - Alterar alias

Nilson Santos Figueiredo Jr. acid06 at gmail.com
Wed Nov 18 12:34:46 PST 2009


2009/11/18 Eutsiv :: Geovanny Junio <geovanny at eutsiv.com.br>:
> - Fazer um consulta usando a tabela1, tabela2 e tabela3.
> - Então vou mostrar ao usuário que ele tem as seguintes colunas para filtrar
> (ou seja todas as colunas de todas as tabelas envolvidas):
>     tabela1.coluna1 .. tabela1.colunaN
>     tabela2.coluna1 .. tabela2.colunaN
>     tabela3.coluna1 .. tabela3.colunaN
>
> Com base nas colunas o usuário poderá criar filtros que eu efetivamente
> usarei no WHERE.
> A necessidade do formato table.column é que a tabela1 pode contar uma coluna
> nome, e a tabela2 também.
> Por exemplo, imagina as 3 tabelas como cidade, cliente, e contratos.
> O usuário pode querer especificar: clientes chamados João (coluna nome), que
> residem na cidade Barueri (coluna nome).
> Essa confusão toda é pq quero deixar a criação de filtros dinâmica, a medida
> que novos campos forem incluidos nas tabelas,
> eles estarão disponíveis quando um usuário for definir um novo filtro.

Sim, eu entendi o seu problema.
Como eu disse, é só você ler a documentação e o cookbook que eles te
ensinam a fazer queries mais complexas usando a sintaxe do DBIC (na
verdade, SQL::Abstract).

O nome do alias será sempre o nome do relacionamento, exceto pra
tabela atual, que sera "me".

Então, vamos supor que exista a seguinte estrutura: usuário tem um
endereço que pertence a um estado que pertence a um país.

Sua query DBIC para pesquisar pra todos os usuários do Brasil, que
tenham idade maior ou igual a 18 anos, seria algo mais ou menos assim:

my $rs = $schema->resultset('Usuario')->search(
    {
        'me.idade'  => { '>=', 18 },
        'pais.name' => 'Brazil'
    },
    {
        join => { endereco => { estado => 'pais' } }
    }
);

Com isso, é só você montar a hash de pesquisa e fazer os joins à
medida que for necessário. É mais fácil que gerar SQL.

-Nilson Santos F. Jr.


More information about the SaoPaulo-pm mailing list