[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