X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FSchema%2FLoader%2FRelBuilder.pm;h=0a29af1c38ca12e4ab619beb3f1d1388fcbf010c;hb=e344eed6c9cf62f2e5e78a31d8c499014a16c68c;hp=88382bc8371abbf0943e39deac17ea77c0e1fe4d;hpb=c39e35077d88eb3c81696032a2e51fdf5cb69eab;p=dbsrgits%2FDBIx-Class-Schema-Loader.git diff --git a/lib/DBIx/Class/Schema/Loader/RelBuilder.pm b/lib/DBIx/Class/Schema/Loader/RelBuilder.pm index 88382bc..0a29af1 100644 --- a/lib/DBIx/Class/Schema/Loader/RelBuilder.pm +++ b/lib/DBIx/Class/Schema/Loader/RelBuilder.pm @@ -5,7 +5,7 @@ use warnings; use Carp::Clan qw/^DBIx::Class/; use Lingua::EN::Inflect::Number (); -our $VERSION = '0.04002'; +our $VERSION = '0.04999_02'; =head1 NAME @@ -121,8 +121,19 @@ sub _inflect_singular { return Lingua::EN::Inflect::Number::to_S($relname); } +sub _array_eq { + my ($a, $b) = @_; + + return unless @$a == @$b; + + for (my $i = 0; $i < @$a; $i++) { + return unless $a->[$i] eq $b->[$i]; + } + return 1; +} + sub generate_code { - my ($self, $local_moniker, $rels) = @_; + my ($self, $local_moniker, $rels, $uniqs) = @_; my $all_code = {}; @@ -187,17 +198,32 @@ sub generate_code { delete $rev_cond{$_}; } + my $remote_method = 'has_many'; + + # If the local columns have a UNIQUE constraint, this is a one-to-one rel + my $local_source = $self->{schema}->source($local_moniker); + if (_array_eq([ $local_source->primary_columns ], $local_cols) || + grep { _array_eq($_->[1], $local_cols) } @$uniqs) { + $remote_method = 'might_have'; + $local_relname = $self->_inflect_singular($local_relname); + } + + # If the referring column is nullable, make 'belongs_to' an outer join: + my $nullable = grep { $local_source->column_info($_)->{is_nullable} } + @$local_cols; + push(@{$all_code->{$local_class}}, { method => 'belongs_to', args => [ $remote_relname, $remote_class, \%cond, + $nullable ? { join_type => 'LEFT OUTER' } : () ], } ); push(@{$all_code->{$remote_class}}, - { method => 'has_many', + { method => $remote_method, args => [ $local_relname, $local_class, \%rev_cond,