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>