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) = @_; |
99be059e |
17 | unless (ref $cond) { |
fd4df975 |
18 | $class->ensure_class_loaded($f_class); |
103647d5 |
19 | my ($pri, $too_many) = $class->primary_columns; |
fd4df975 |
20 | $class->throw_exception( |
21 | "might_have/has_one can only infer join for a single primary key; ". |
22 | "${class} has more" |
23 | ) if $too_many; |
103647d5 |
24 | my $f_class_loaded = eval { $f_class->columns }; |
8e04bf91 |
25 | my ($f_key,$guess); |
dcf8330b |
26 | if (defined $cond && length $cond) { |
99be059e |
27 | $f_key = $cond; |
dcf8330b |
28 | $guess = "caller specified foreign key '$f_key'"; |
103647d5 |
29 | } elsif ($f_class_loaded && $f_class->has_column($rel)) { |
07037f89 |
30 | $f_key = $rel; |
dcf8330b |
31 | $guess = "using given relationship '$rel' for foreign key"; |
07037f89 |
32 | } else { |
103647d5 |
33 | ($f_key, $too_many) = $f_class->primary_columns; |
fd4df975 |
34 | $class->throw_exception( |
35 | "might_have/has_one can only infer join for a single primary key; ". |
36 | "${f_class} has more" |
37 | ) if $too_many; |
dcf8330b |
38 | $guess = "using primary key of foreign class for foreign key"; |
22b15c96 |
39 | } |
fd4df975 |
40 | $class->throw_exception( |
41 | "No such column ${f_key} on foreign class ${f_class} ($guess)" |
42 | ) if $f_class_loaded && !$f_class->has_column($f_key); |
503536d5 |
43 | $cond = { "foreign.${f_key}" => "self.${pri}" }; |
07037f89 |
44 | } |
07037f89 |
45 | $class->add_relationship($rel, $f_class, |
46 | $cond, |
503536d5 |
47 | { accessor => 'single', |
07037f89 |
48 | cascade_update => 1, cascade_delete => 1, |
49 | ($join_type ? ('join_type' => $join_type) : ()), |
503536d5 |
50 | %{$attrs || {}} }); |
07037f89 |
51 | 1; |
22b15c96 |
52 | } |
53 | |
54 | 1; |