Beefy Boxes and Bandwidth Generously Provided by pair Networks
good chemistry is complicated,
and a little bit messy -LW

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 meditating upon the Monastery: (16)
As of 2016-06-30 12:59 GMT
Find Nodes?
    Voting Booth?
    My preferred method of making French fries (chips) is in a ...

    Results (395 votes). Check out past polls.