#!/usr/bin/perl use Class::DBI; package MyPackage; use base ('Class::DBI'); FsDBI->set_db('Main', 'DBI:mysql:databasename', 'user', 'password'); package MyPackage::user; use base ('MyPackage'); MyPackage::User->table('user'); MyPackage::User->columns(Essential => qw(id role_id name lastname)); MyPackage::User ->has_a (role_id => 'FsDBI::role'); package MyPackage::role; use base ('MyPackage'); MyPackage::role->table('role'); MyPackage::role->columns(Essential => qw(id role_title)); #### #!/usr/bin/perl use MyPackage; my $testuser=MyPackage::user->retrieve(1); print "user with id 1 is $testuser \"; print "\n"; print "user with id 1 has role $testuser->role_id(1)"; #### #!/usr/bin/perl use Class::DBI; package MyPackageO2M; use base ('Class::DBI'); FsDBI->set_db('Main', 'DBI:mysql:databasename', 'user', 'password'); package MyPackage::Tester; use base ('MyPackageO2M'); MyPackage::Tester->table('user'); MyPackage::Tester->columns(Essential => qw(id role_id name lastname)); # see the difference: the method name (ihavesomuchroles) can be completely different to the database-table. # which means in a 1:m situation, even the Classes can have different names than the originating database-tables. # (MyPackage::user VS MyPackage::Tester) MyPackage::Tester ->has_many (ihavesomuchroles => 'MyPackage::role','id'); # the 'id' argument to 'ihavesomuchroles' is the destination field for MyPackage::role package MyPackage::role; use base ('MyPackage'); MyPackage::role->table('role'); MyPackage::role->columns(Essential => qw(id role_title)); #### #!/usr/bin/perl use MyPackageO2M; my $testuser=MyPackage::user->retrieve(1); print "user with id 1 is $testuser \n"; print "and has roles:\n"; @roles=$testuser->ihavesomuchroles; foreach my $temp (@roles) { print "role: $temp->id."and".$temp->role_title."\n";}