Commit | Line | Data |
c0e7b4e5 |
1 | package # hide from PAUSE |
2 | DBIx::Class::Relationship::HasOne; |
22b15c96 |
3 | |
4 | use strict; |
5 | use warnings; |
6 | |
07037f89 |
7 | sub might_have { |
8 | shift->_has_one('LEFT' => @_); |
9 | } |
10 | |
22b15c96 |
11 | sub has_one { |
e5d98edd |
12 | shift->_has_one(undef() => @_); |
07037f89 |
13 | } |
14 | |
15 | sub _has_one { |
503536d5 |
16 | my ($class, $join_type, $rel, $f_class, $cond, $attrs) = @_; |
36e58b24 |
17 | eval "require $f_class"; |
55de06f1 |
18 | if ($@) { |
701da8c4 |
19 | $class->throw_exception($@) unless $@ =~ /Can't locate/; |
55de06f1 |
20 | } |
21 | |
99be059e |
22 | unless (ref $cond) { |
103647d5 |
23 | my ($pri, $too_many) = $class->primary_columns; |
701da8c4 |
24 | $class->throw_exception( "might_have/has_one can only infer join for a single primary key; ${class} has more" ) |
07037f89 |
25 | if $too_many; |
103647d5 |
26 | my $f_class_loaded = eval { $f_class->columns }; |
8e04bf91 |
27 | my ($f_key,$guess); |
dcf8330b |
28 | if (defined $cond && length $cond) { |
99be059e |
29 | $f_key = $cond; |
dcf8330b |
30 | $guess = "caller specified foreign key '$f_key'"; |
103647d5 |
31 | } elsif ($f_class_loaded && $f_class->has_column($rel)) { |
07037f89 |
32 | $f_key = $rel; |
dcf8330b |
33 | $guess = "using given relationship '$rel' for foreign key"; |
07037f89 |
34 | } else { |
103647d5 |
35 | ($f_key, $too_many) = $f_class->primary_columns; |
701da8c4 |
36 | $class->throw_exception( "might_have/has_one can only infer join for a single primary key; ${f_class} has more" ) |
07037f89 |
37 | if $too_many; |
dcf8330b |
38 | $guess = "using primary key of foreign class for foreign key"; |
22b15c96 |
39 | } |
701da8c4 |
40 | $class->throw_exception("No such column ${f_key} on foreign class ${f_class} ($guess)") |
103647d5 |
41 | if $f_class_loaded && !$f_class->has_column($f_key); |
503536d5 |
42 | $cond = { "foreign.${f_key}" => "self.${pri}" }; |
07037f89 |
43 | } |
07037f89 |
44 | $class->add_relationship($rel, $f_class, |
45 | $cond, |
503536d5 |
46 | { accessor => 'single', |
07037f89 |
47 | cascade_update => 1, cascade_delete => 1, |
48 | ($join_type ? ('join_type' => $join_type) : ()), |
503536d5 |
49 | %{$attrs || {}} }); |
07037f89 |
50 | 1; |
22b15c96 |
51 | } |
52 | |
53 | 1; |