CREATE TABLE `user` (
`id` int unsigned NOT NULL auto_increment,
`username` VARCHAR(100) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `role` (
`id` int unsigned NOT NULL auto_increment,
`name` VARCHAR(25) NOT NULL UNIQUE,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `user_role` (
`user` int unsigned NOT NULL,
`role` int unsigned NOT NULL,
PRIMARY KEY (`user`,`role`),
FOREIGN KEY (`user`) REFERENCES user(id),
FOREIGN KEY (`role`) REFERENCES role(id)
) ENGINE=InnoDB;
####
MyApp::Schema::Result::User
MyApp::Schema::Result::Role
MyApp::Schema::Result::UserRole
####
# Created by DBIx::Class::Schema::Loader v0.04999_06 @ 2009-02-28 19:14:54
# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:iS0oJWk28gjL7QD50cdRqQ
no warnings "uninitialized";
use Scalar::Util "blessed";
use List::Util "first";
__PACKAGE__->many_to_many( roles => "user_roles", "role" );
sub has_role : method {
my $self = shift;
my $role = shift || return;
if ( blessed $role )
{
return first { $role->id == $_->id } $self->roles;
}
elsif ( $role =~ /\A\d+\z/ )
{
return first { $role == $_->id } $self->roles;
}
else
{
return first { $role eq $_->name } $self->roles;
}
return;
}
####
use overload '""' => sub {
return +shift->name;
}, fallback => 1;
####
my $attr = { RaiseError => 1,
AutoCommit => 1,
ChopBlanks => 1,
};
my $schema = MyApp::Schema->connect
(
"dbi:mysql:db_name",
$user,
$pass,
$attr
);
# Just grab one-
my $user = $schema->resultset("User")
->search({},{ order_by => 'RAND()' })->first;
print
"User ", $user->username,
" has these roles: ",
join(", ", $user->roles) || "none!", "\n";