[Cascavel-pm] Exemplo de relacao many-to-many com Class::DBI

Rod Za rodzadra em yahoo.com
Quarta Abril 13 05:48:10 PDT 2005


Cara, era brincadeirinha aquele papo de excluído. :p

> > Mas não seja por isso, eu ainda estou na dúvida de como usar corretamente o relacionamento da
> > Class::DBI. Por exemplo, pegando como base as classes que fiz seria certo eu criar um objeto
> > dbUser e acessar todos as outras classes por ele? ex: historico, grupos, etc? Ou eu teria que
> > criar um objeto para cada classe? (dá pra mandar um exemplo??) :)
> > 
>    Uh? Lamento, mas eu não entendi.
>    dbUser é uma tabela? O objeto representaria o que?


A classe dbUser representa a tabela users - (vide abaixo). Eu criei várias classes, cada uma
representando uma tabela do banco de dados e seus "relacionamentos".

Com estas classes eu quero conhecer o historico de determinado usuário, de determinado grupo e/ou
de determinado usuario+grupo.

Até aqui tudo bem, se eu crio um objeto dbUser eu consigo acessar todas as informaćões
pertinentes ao usuario e aos grupos o qual ele pertence:

<code>
...
use dbUser;
my ($objUser) = dbUser->retrieve(login => 'rodzadra');
printf "O usuario %s esta associado aos grupos:\n",$objUser->login;
foreach ( $objUser->groups ) {
     print "GID: %d Nome do Grupo: %s\n".$_->groups->id_group,$_->groups->group_name;
}
...
</code>

A minha dúvida é quanto ao acesso dos dados do histórico (tabela history classe dbHistory). O
certo seria eu acessar esses dados a partir do objeto dbUser, dbGroup ou através do objeto
dbRelationship?

dbUser<->dbRelationshiop<->dbGroup
   |           ?             | 
   +-------------------------+ 
               |
               +-> dbHistory <- dbAction

Eu defini minhas classes desse modo:

<code>
package dbBase;
use base qw/Class::DBI/;

__PACKAGE__->set_db( "Main", "dbi:mysql:Test", "TEST_USER", "TESTPASS" 
);
1;

package dbUser;
use lib '/home/rodza/perl_tests';
use base 'dbBase';
dbUser->table('users');
dbUser->columns( All => qw/id_user login/ );
dbUser->has_many( groups => [dbRelationship => 'id_group'] => 'id_user' );
1;

package dbGroup;
use lib '/home/rodza/perl_tests';
use base 'dbBase';
dbGroup->table('groups');
dbGroup->columns( All => qw/id_group group_name/ );
dbUser->has_many( users => [dbRelationship => 'id_user'] => 'id_group' );
1;

package dbRelationship;
use lib '/home/rodza/perl_tests';
use base 'dbBase';
dbRelationship->table('relationship');
dbRelationship->columns( Primary => qw/id_user id_group/ );
dbRelationship->has_a( id_group => dbGroup );
dbRelationship->has_a( id_user => dbUser );
dbRelationship->has_many( history => dbHistory => 'id_user' );
1;

package dbHistory;
use lib '/home/rodza/perl_tests';
use base 'dbBase';
dbHistory->table('history');
dbHistory->columns( All => qw/id_user id_group action date/ );
dbHistory->has_a( id_action => dbAction );

1;

package dbAction;
use lib '/home/rodza/perl_tests';
use base 'dbBase';
dbAction->table('action');
dbAction->columns( All => qw/id_action action/ );
1;
</code>



		
__________________________________ 
Do you Yahoo!? 
Yahoo! Small Business - Try our new resources site!
http://smallbusiness.yahoo.com/resources/


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