On 1/7/07 10:02 AM, Uwe Voelker wrote:
> Then I have a question for John (or anybody else). I would like to use
> an many to many relationship with attributes. This means my map class
> (ProductColorMap in the examples) has an additional field (which is no
> key column). How can I use this?
>
> Or do I have to give up my many to many relationship and should use two
> seperate relations instead.
Breaking the m-to-m into a 1-to-m and a m-to-1 is the most straightforward
way to do it.
If you want to preserve some of the "flattened" convenience of m-to-m, you
can put proxy methods in the map class. Example:
package Product;
...
relationships =>
[
product_colors =>
{
type => 'one to many',
class => 'ProductColorMap',
column_map => { id => 'product_id' },
},
...
]
package ProductColorMap;
...
relationships =>
[
color =>
{
type => 'many to one',
class => 'Color',
column_map => { color_id => 'id' },
},
...
]
...
# Get or create Color object
sub _color
{
my($self) = shift;
return $self->color || $self->color(Color->new);
}
# Proxy these methods to the color object
foreach my $color_attr (qw(name code ...))
{
no strict 'refs';
*{"color_$color_attr"} = sub { shift->_color->$color_attr() };
}
Then, in your Product class, using just a 1-to-m to ProductColorMap, you can
make it appear as if those map records actually contain the color columns:
$p->product_colors({ desc => 'blah', # map record attr
color_name => 'red', # Color attr
color_code => 123, }, # Color attr
...);
On the "fetching" side, you could keep a m-to-m relationship around and use
it as per this thread:
http://www.mail-archive.com/[email protected]/msg01147.ht
ml
or you can modify your 1-to-m Product -> ProductColorMap relationship and
set it to always load color records:
relationships =>
[
product_colors =>
{
type => 'one to many',
class => 'ProductColorMap',
column_map => { id => 'product_id' },
manager_args => { require_objects => [ 'color' ] },
},
...
]
# Now this takes only one database query
my $color_names = map { $_->color_name } $p->product_colors;
-John
-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys - and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
Rose-db-object mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/rose-db-object