my $self = shift;
my %params = @_;
- my $wanted = $params{direction} || croak("Missing parameter `direction'");
+ my $wanted = $params{direction};
+
+ if (!$wanted) {
+ if ($params{to} && $params{from}) {
+ $wanted = 'both';
+ } elsif ($params{to}) {
+ $wanted = 'to';
+ } elsif ($params{from}) {
+ $wanted = 'from';
+ } else {
+ $wanted = 'both';
+ }
+ }
if ($wanted eq 'both') {
my $both = delete($params{both});
);
my $link = SL::DB::Manager::RecordLink->find_by(and => [ %data ]);
- push @links, $link ? $link : SL::DB::RecordLink->new(%data)->save unless $link;
+ push @links, $link ? $link : SL::DB::RecordLink->new(%data)->save;
}
return wantarray ? @links : $links[0];
use SL::DB::Helper::LinkedRecords;
# later in consumer code
- # retrieve all links
- my @linked_objects = $order->linked_records(
- direction => 'both',
- );
+ # retrieve all links in both directions
+ my @linked_objects = $order->linked_records;
# only links to Invoices
my @linked_objects = $order->linked_records(
- direction => 'to',
to => 'Invoice',
);
# more than one target
my @linked_objects = $order->linked_records(
- direction => 'to',
to => [ 'Invoice', 'Order' ],
);
# more than one direction
my @linked_objects = $order->linked_records(
- direction => 'both',
both => 'Invoice',
);
# more than one direction and different targets
my @linked_objects = $order->linked_records(
- direction => 'both',
to => 'Invoice',
from => 'Order',
);
via => 'DeliveryOrder',
);
+ # limit direction when further params contain additional keys
+ my %params = (to => 'Invoice', from => 'Order');
+ my @linked_objects = $order->linked_records(
+ direction => 'to',
+ %params,
+ );
+
# add a new link
$order->link_to_record($invoice);
$order->link_to_record($purchase_order, bidirectional => 1);
=item C<linked_records %params>
-Retrieves records linked from or to C<$self> via the table C<record_links>. The
-mandatory parameter C<direction> (either C<from>, C<to> or C<both>) determines
-whether the function retrieves records that link to C<$self> (for C<direction>
-= C<to>) or that are linked from C<$self> (for C<direction> = C<from>). For
-C<direction = both> all records linked from or to C<$self> are returned.
+Retrieves records linked from or to C<$self> via the table C<record_links>.
+
+The optional parameter C<direction> (either C<from>, C<to> or C<both>)
+determines whether the function retrieves records that link to C<$self> (for
+C<direction> = C<to>) or that are linked from C<$self> (for C<direction> =
+C<from>). For C<direction = both> all records linked from or to C<$self> are
+returned.
The optional parameter C<from> or C<to> (same as C<direction>) contains the
package names of Rose models for table limitation (the prefix C<SL::DB::> is
names in an array reference in which case all links matching any of the model
names will be returned.
+If no parameter C<direction> is given, but any of C<to>, C<from> or C<both>,
+then C<direction> is infered accordingly. If neither are given, C<direction> is
+set to C<both>.
+
The optional parameter C<via> can be used to retrieve all documents that may
have intermediate documents inbetween. It is an array reference of Rose package
names for the models that may be intermediate link targets. One example is
-use Test::More;
+use Test::More tests => 43;
use strict;
is $link->to_id, $i->id, 'to_id';
# retrieve link
+$links = $o1->linked_records;
+is $links->[0]->id, $i->id, 'simple retrieve';
+
$links = $o1->linked_records(direction => 'to', to => 'Invoice');
is $links->[0]->id, $i->id, 'direct retrieve 1';
$links = $o2->linked_records(direction => 'both');
is @$links, 2, 'links without from/to get all';
+# doc states you can limit with direction when giving excess params
+$links = $d->linked_records(direction => 'to', to => 'Invoice', from => 'Order');
+is $links->[0]->id, $i->id, 'direction to limit params 1';
+is @$links, 1, 'direction to limit params 2';
+
# doc says there will be special values set... lets see
$links = $o1->linked_records(direction => 'to', to => 'Order');
is $links->[0]->{_record_link_direction}, 'to', '_record_link_direction to';
is $links->[0]->{_record_link}->to_id, $o1->id, '_record_link from';
# check if bidi returns an array of links
-{ local $TODO = 'does not work as advertised';
my @links = $d->link_to_record($o2, bidirectional => 1);
is @links, 2, 'bidi returns array of links in array context';
-}
# via
$links = $o2->linked_records(direction => 'to', to => 'Invoice', via => 'DeliveryOrder');
$sorted = SL::DB::Helper::LinkedRecords->sort_linked_records('date', 0, @records);
is_deeply $sorted, [$d, $o1, $i, $o2], 'sorting by transdate desc';
-done_testing();
-
1;