Beefy Boxes and Bandwidth Generously Provided by pair Networks
Syntactic Confectionery Delight

Re: Class::DBI and DB design

by tunaboy (Curate)
on Jun 06, 2003 at 22:15 UTC ( #263874=note: print w/replies, xml ) Need Help??

in reply to Class::DBI and DB design

I have a little more time now so I figured I might as well show how I would alter your schema to work with Class::DBI (I am not claiming this is the way you should do it, merely how I would):

package My::User; use base 'My::ClassDBI'; __PACKAGE__->table ('user'); __PACKAGE__->columns ( All => qw( uid name login ) ); __PACKAGE__->has_many( 'capabilities', 'My::UserCapability' => 'user' +); ### package My::Capability; use base 'My::ClassDBI'; __PACKAGE__->table ('capability'); __PACKAGE__->columns ( All => qw( capid name default ) ); __PACKAGE__->has_many( 'users', 'My::UserCapability' => 'capability' ) +; ### package My::UserCapability; use base 'My::ClassDBI'; __PACKAGE__->table ('user_capability'); # note the added primary key idx __PACKAGE__->columns ( All => qw( idx user capability ) ); __PACKAGE__->has_a( 'user' => 'My::User' ); __PACKAGE__->has_a( 'capability' => 'My::Capability' );

You could now print out all the capabilities for a user with:

foreach ( $user->capabilities() ) { print $_->capability->name(), "\n"; }
or all the users with a certain capability:
foreach ( $capability->users() ) { print $_->user->name(), "\n"; }
The users and capabilities methods might be better named as they don't really return a list of users or capabilites but rather return a list of My::UserCapability objects. But you could write a custom get_capabilities method such as:
sub get_capabilities { my ( $self ) = @_; my @capabilities = $self->capabilities(); return map { $_->capability->name() } @capabilities; }

It is a bit of work getting around the single primary key limitation of Class::DBI but IMHO well worth it.

NOTE: I think all the code is correct as given but I could be drastically wrong as it is late on a Friday afternoon.

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://263874]
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others avoiding work at the Monastery: (6)
As of 2020-09-29 08:11 GMT
Find Nodes?
    Voting Booth?
    If at first I donít succeed, I Ö

    Results (146 votes). Check out past polls.