[Cascavel-pm] DBIx::Class - buscando dados de uma tabela de ligação

eden edencardim em gmail.com
Segunda Novembro 26 04:54:41 PST 2007


On Nov 26, 2007 9:07 AM, Donato Azevedo <donatoaz em gmail.com> wrote:
> Olá pessoal,
> estou com uma duvida sobre o DBIx::Class, eu ja tive este problema antes mas
> acho que a forma que usei pra resolver foi meio gambiarra...
>
> Eu tenho um relacionamento many_to_many entre veiculos e pecas, e a tabela
> de relacionamento, veiculo_peca, contem alguns dados extras (alem dos ids do
> veiculo e da peca).
>
> Qual a melhor forma de buscar estes dados quando pesquisando pelas pecas de
> um veiculo?
>
> Tipo:
>
> my $car = $schema->resultset('Veiculo')->find(1);
> my $part = $car->pecas->first;
>
> o campo quantidade é uma coluna da tabela de ligação, porém seria
> interessante que o objeto $part contivesse este dado, já que está ligado ao
> objeto $car... (ou não?)
>
>
> O que eu estava fazendo é o seguinte:
>  criei um metodo em Veiculo que busca a row de ligacao, tipo:
> my $relship = $car->fetch_relationship_row( $part );
>
> que é mais ou menos assim:
>
> sub fetch_relationship_row
> {
>     my $self = shift;
>      my $part = shift;
>     return $self->veiculo_pecas->find( $self->id, $part->id );
> }
>
>
> mas acho que deve ter algo mais elegante pra fazer usando proxies ou coisas
> do tipo....
>
> alguma luz?
>
> abraços!!!

Sim, eu acho mais fácil você tratar o objeto da tabela relacionamento
como se fosse uma peça e instalar proxies para a tabela peça nele:

sub search_peca {
    my($self, $attribs) = @_;
    my $table = $self->pecas_rel->result_source->table;
    %$attribs = map { "${table}.${_}" => $attribs->{$_} } keys %$attribs;
    return $self->pecas_rel->search($attribs, {join => $table,
prefetch => { $table => [keys %$attribs] } })
}

my $peca = $car->search_peca({ etc... });

$peca->campo1; # retorna peca.campo1
$peca->quantidade; # retorna veiculo_peca.quantidade

Você precisa instalar os proxies manualmente pra usar accessors para a
tabela peca, senão você vai ter que chamar get_columns pros campos que
estão em peca:

$peca->get_column('campo1');

-- 
edenc.vox.com


Mais detalhes sobre a lista de discussão Cascavel-pm