CREATE TABLE `user` ( `user_id` int(11) NOT NULL auto_increment, `firstname` varchar(50) NOT NULL default '', `lastname` varchar(50) NOT NULL default '', PRIMARY KEY (`user_id`) ) TYPE=MyISAM; insert into `user` values (1, 'John', 'Day'), (2, 'Jacqui', 'Burke'), (3, 'Brenda', 'Day'), (4, 'Cassie', 'Cat'), (5, 'Steven', 'Burke'), (6, '', ''); CREATE TABLE `role` ( `role_id` int(11) NOT NULL auto_increment, `rolename` varchar(50) NOT NULL default '', PRIMARY KEY (`role_id`) ) TYPE=MyISAM; insert into role values (1, 'Typist'), (2, 'Programmer'), (3, 'Cleaner'); CREATE TABLE `user_role` ( `user_id` int(11) NOT NULL default '0', `role_id` int(11) NOT NULL default '0' ) TYPE=MyISAM; insert into user_role values (1, 1), (1, 2), (1, 3), (2, 2), (3, 1), (3, 2), (0, 0); #### package Test::DBI; use base 'Class::DBI'; Test::DBI->set_db('Main', 'DBI:mysql:appsys2', '****', '****'); package TestDBI::userrole; use base 'Test::DBI'; __PACKAGE__->table('user_role'); __PACKAGE__->columns(All => qw(user_id role_id)); __PACKAGE__->has_a( role_id => TestDBI::role ); __PACKAGE__->has_a( user_id => TestDBI::user ); package TestDBI::user; use base 'Test::DBI'; __PACKAGE__->table('user'); __PACKAGE__->columns(All => qw(user_id firstname lastname)); __PACKAGE__->has_many(haveroles => ['TestDBI::userrole' => 'role_id'] ); package TestDBI::role; use base 'Test::DBI'; __PACKAGE__->table('role'); __PACKAGE__->columns(All => qw(role_id rolename)); 1; #### #!/usr/local/bin/perl; use warnings; use strict; use Data::Dumper; use Test::DBI; my $testuser = TestDBI::user->retrieve( 1 ); print "user with id 1 is: ". $testuser->firstname ."\n"; print "and has roles:\n"; my @roles = $testuser->haveroles; print Dumper( \@roles ); #foreach (@roles) { # print "role: " . $_->id . " and " . $_->rolename . "\n"; #} exit; #### user with id 1 is: John and has roles: is not a column of TestDBI::userrole at test.pl line 12 [root@posiedon3 www]#