1 package SL::DB::Helpers::LinkedRecords;
 
   4 our @ISA    = qw(Exporter);
 
   5 our @EXPORT = qw(linked_records link_to_record);
 
   9 use SL::DB::Helpers::Mappings;
 
  10 use SL::DB::RecordLink;
 
  16   my $wanted   = $params{direction} || croak("Missing parameter `direction'");
 
  17   my $myself   = $wanted eq 'from' ? 'to' : $wanted eq 'to' ? 'from' : croak("Invalid parameter `direction'");
 
  19   my $my_table = SL::DB::Helpers::Mappings::get_table_for_package(ref($self));
 
  21   my @query    = ( "${myself}_table" => $my_table,
 
  22                    "${myself}_id"    => $self->id );
 
  24   if ($params{$wanted}) {
 
  25     my $wanted_table = SL::DB::Helpers::Mappings::get_table_for_package($params{$wanted}) || croak("Invalid parameter `${wanted}'");
 
  26     push @query, ("${wanted}_table" => $wanted_table);
 
  29   my $links            = SL::DB::Manager::RecordLink->get_all(query => [ and => \@query ]);
 
  31   my $sub_wanted_table = "${wanted}_table";
 
  32   my $sub_wanted_id    = "${wanted}_id";
 
  35   @query               = ref($params{query}) eq 'ARRAY' ? @{ $params{query} } : ();
 
  37   foreach my $link (@{ $links }) {
 
  38     my $class = SL::DB::Helpers::Mappings::get_manager_package_for_table($link->$sub_wanted_table);
 
  39     push @{ $records }, @{ $class->get_all(query => [ id => $link->$sub_wanted_id, @query ]) };
 
  49   croak "self has no id"  unless $self->id;
 
  50   croak "other has no id" unless $other->id;
 
  52   my %params = ( from_table => SL::DB::Helpers::Mappings::get_table_for_package(ref($self)),
 
  54                  to_table   => SL::DB::Helpers::Mappings::get_table_for_package(ref($other)),
 
  58   my $link = SL::DB::Manager::RecordLink->find_by(and => [ %params ]);
 
  59   return $link ? $link : SL::DB::RecordLink->new(%params)->save;
 
  70 SL::DB::Helpers::LinkedRecords - Mixin for retrieving linked records via the table C<record_links>
 
  76 =item C<linked_records %params>
 
  78 Retrieves records linked from or to C<$self> via the table
 
  79 C<record_links>. The mandatory parameter C<direction> (either C<from>
 
  80 or C<to>) determines whether the function retrieves records that link
 
  81 to C<$self> (for C<direction> = C<to>) or that are linked from
 
  82 C<$self> (for C<direction> = C<from>).
 
  84 The optional parameter C<from> or C<to> (same as C<direction>)
 
  85 contains the package name of a Rose model for table limitation. If you
 
  86 only need invoices created from an order C<$order> then the call could
 
  89   my $invoices = $order->linked_records(direction => 'to',
 
  90                                         to        => 'SL::DB::Invoice');
 
  92 The optional parameter C<query> can be used to limit the records
 
  93 returned. The following call limits the earlier example to invoices
 
  96   my $invoices = $order->linked_records(direction => 'to',
 
  97                                         to        => 'SL::DB::Invoice',
 
  98                                         query     => [ transdate => DateTime->today_local ]);
 
 100 Returns an array reference.
 
 102 =item C<link_to_record $record>
 
 104 Will create an entry in the table C<record_links> with the C<from>
 
 105 side being C<$self> and the C<to> side being C<$record>. Will only
 
 106 insert a new entry if such a link does not already exist.
 
 108 Returns either the existing link or the newly created one as an
 
 109 instance of C<SL::DB::RecordLink>.
 
 119 Moritz Bunkus E<lt>m.bunkus@linet-services.deE<gt>