[Dbix-class] Three patterns for many-to-many relationships

Shevek shevek at anarres.org
Sun Apr 16 00:29:31 CEST 2006


I'm not on the list, but Matt asked me to post this anyway. It contains
three patterns for making M-M relationships "work". I suggested that
these might appear just as "add_to_..." appears for a has_many
relationship.

      6 sub set_XXXs {
      7     my $self = shift;
      8     my @create = map { ref($_) ? $_->id : $_ } @_;
     10     my %exists = map { $_->XXX_id => $_ } $self->XXX_links;
     11     for (@create) {
     12         if (delete $exists{$_}) {
     13             # print STDERR "Exists $_\n";
     14             next;
     15         }
     16         # print STDERR "Create $_\n";
     17         $self->add_to_XXX_links({
     18             XXX_id => $_,
     19         });
     20     }
     21     for (values %exists) {
     22         # XXX Make sure this doesn't cascade.
     23         # print STDERR "Delete " . $_->id . "\n";
     24         $_->delete;
     25     }
     26 }

     69 sub add_to_XXXs {
     70     my $self = shift;
     71     my @create = map { ref($_) ? $_->id : $_ } @_;
     72     my %create = map { $_ => 1 } @create;
     73     my @links = $self->XXX_links;
     74     for (@links) {
     75         my $id = $_->XXX_id;
     76         delete $create{$id};
     77     }
     78     for (keys %create) {
     80         $self->add_to_XXX_links({
     81             XXX_id => $_,
     82         });
     83     }
     84 }

     86 sub remove_from_XXXs {
     87     my $self = shift;
     88     my @delete = map { ref($_) ? $_->id : $_ } @_;
     89     # print STDERR "Delete: @delete\n";
     90     my %delete = map { $_ => 1 } @delete;
     91     my @links = $self->XXX_links;
     92     for (@links) {
     93         my $id = $_->XXX_id;
     94         $_->delete if $delete{$id};
     95     }
     96 }

I edited this in the mail to tweak it a bit, so read with care.

Thanks.

S.

-- 
Shevek <shevek at anarres.org>




More information about the Dbix-class mailing list