Tweaks to $obj->update and relationship helpers
[dbsrgits/DBIx-Class.git] / lib / DBIx / Class / Relationship / BelongsTo.pm
CommitLineData
07037f89 1package DBIx::Class::Relationship::BelongsTo;
2
3use strict;
4use warnings;
5
6sub belongs_to {
7 my ($class, $rel, $f_class, $cond, $attrs) = @_;
8 eval "require $f_class";
9 # single key relationship
10 if (not defined $cond) {
11 my ($pri, $too_many) = keys %{ $f_class->_primaries };
12 my $acc_type = ($class->_columns->{$rel}) ? 'filter' : 'single';
13 $class->add_relationship($rel, $f_class,
14 { "foreign.${pri}" => "self.${rel}" },
15 { accessor => $acc_type }
16 );
17 }
18 # multiple key relationship
19 else {
99be059e 20 my %f_primaries = eval { %{ $f_class->_primaries } };
21 my $f_loaded = !$@;
07037f89 22 my $cond_rel;
23 for (keys %$cond) {
99be059e 24 if (m/\./) { # Explicit join condition
25 $cond_rel = $cond;
26 last;
27 }
07037f89 28 $cond_rel->{"foreign.$_"} = "self.".$cond->{$_};
29 # primary key usage checks
30 if (exists $f_primaries{$_}) {
31 delete $f_primaries{$_};
99be059e 32 } elsif ($f_loaded) {
07037f89 33 $class->throw("non primary key used in join condition: $_");
34 }
35 }
99be059e 36 $class->throw("not all primary keys used in multi key relationship!") if $f_loaded && keys %f_primaries;
07037f89 37 $class->add_relationship($rel, $f_class,
38 $cond_rel,
39 { accessor => 'single', %{$attrs ||{}} }
40 );
41 }
42 return 1;
43}
44
503536d5 45=head1 AUTHORS
46
47Alexander Hartmaier <Alexander.Hartmaier@t-systems.at>
48
49Matt S. Trout <mst@shadowcatsystems.co.uk>
50
51=cut
52
07037f89 531;