Commit | Line | Data |
75d07914 |
1 | package # hide from PAUSE |
c0e7b4e5 |
2 | DBIx::Class::Relationship::HasMany; |
07037f89 |
3 | |
4 | use strict; |
5 | use warnings; |
ed7ab0f4 |
6 | use Try::Tiny; |
fd323bf1 |
7 | use namespace::clean; |
07037f89 |
8 | |
fd323bf1 |
9 | our %_pod_inherit_config = |
044e70c7 |
10 | ( |
11 | class_map => { 'DBIx::Class::Relationship::HasMany' => 'DBIx::Class::Relationship' } |
12 | ); |
13 | |
07037f89 |
14 | sub has_many { |
15 | my ($class, $rel, $f_class, $cond, $attrs) = @_; |
c037c03a |
16 | |
dcf8330b |
17 | unless (ref $cond) { |
fd4df975 |
18 | |
0b0743af |
19 | my $pri = $class->result_source_instance->_single_pri_col_or_die; |
aeb1bf75 |
20 | |
21 | my ($f_key,$guess); |
07037f89 |
22 | if (defined $cond && length $cond) { |
23 | $f_key = $cond; |
dcf8330b |
24 | $guess = "caller specified foreign key '$f_key'"; |
07037f89 |
25 | } else { |
d77ee505 |
26 | $class =~ /([^\:]+)$/; # match is safe - $class can't be '' |
dcf8330b |
27 | $f_key = lc $1; # go ahead and guess; best we can do |
0b0743af |
28 | $guess = "using our class name '$class' as foreign key source"; |
07037f89 |
29 | } |
aeb1bf75 |
30 | |
38fe1ff9 |
31 | # FIXME - this check needs to be moved to schema-composition time... |
32 | # # only perform checks if the far side appears already loaded |
33 | # if (my $f_rsrc = try { $f_class->result_source_instance } ) { |
34 | # $class->throw_exception( |
35 | # "No such column '$f_key' on foreign class ${f_class} ($guess)" |
36 | # ) if !$f_rsrc->has_column($f_key); |
37 | # } |
d4daee7b |
38 | |
8e04bf91 |
39 | $cond = { "foreign.${f_key}" => "self.${pri}" }; |
07037f89 |
40 | } |
41 | |
edcecdbb |
42 | my $default_cascade = ref $cond eq 'CODE' ? 0 : 1; |
43 | |
303cf522 |
44 | $class->add_relationship($rel, $f_class, $cond, { |
45 | accessor => 'multi', |
46 | join_type => 'LEFT', |
edcecdbb |
47 | cascade_delete => $default_cascade, |
48 | cascade_copy => $default_cascade, |
303cf522 |
49 | %{$attrs||{}} |
50 | }); |
07037f89 |
51 | } |
52 | |
53 | 1; |