Commit | Line | Data |
22b15c96 |
1 | package DBIx::Class::Relationship::HasOne; |
2 | |
3 | use strict; |
4 | use warnings; |
5 | |
07037f89 |
6 | sub might_have { |
7 | shift->_has_one('LEFT' => @_); |
8 | } |
9 | |
22b15c96 |
10 | sub has_one { |
07037f89 |
11 | shift->_has_one(undef => @_); |
12 | } |
13 | |
14 | sub _has_one { |
15 | my ($class, $join_type, $rel, $f_class, @columns) = @_; |
16 | my $cond; |
17 | if (ref $columns[0]) { |
18 | $cond = shift @columns; |
19 | } else { |
20 | my ($pri, $too_many) = keys %{ $class->_primaries }; |
21 | $class->throw( "might_have/has_one can only infer join for a single primary key; ${class} has more" ) |
22 | if $too_many; |
23 | my $f_key; |
24 | if ($f_class->_columns->{$rel}) { |
25 | $f_key = $rel; |
26 | } else { |
27 | ($f_key, $too_many) = keys %{ $f_class->_primaries }; |
28 | $class->throw( "might_have/has_one can only infer join for a single primary key; ${f_class} has more" ) |
29 | if $too_many; |
22b15c96 |
30 | } |
07037f89 |
31 | $cond = { "foreign.${f_key}" => "self.${pri}" }, |
32 | } |
33 | shift(@columns) unless defined $columns[0]; # Explicit empty condition |
34 | my %attrs; |
35 | if (ref $columns[0] eq 'HASH') { |
36 | %attrs = %{shift @columns}; |
22b15c96 |
37 | } |
07037f89 |
38 | shift(@columns) unless defined $columns[0]; # Explicit empty attrs |
39 | $class->add_relationship($rel, $f_class, |
40 | $cond, |
41 | { accessor => 'single', (@columns ? (proxy => \@columns) : ()), |
42 | cascade_update => 1, cascade_delete => 1, |
43 | ($join_type ? ('join_type' => $join_type) : ()), |
44 | %attrs }); |
45 | 1; |
22b15c96 |
46 | } |
47 | |
48 | 1; |