X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=SL%2FDB%2FHelper%2FConventionManager.pm;h=830d34cdab754f592e948e9ff5169d703f41d918;hb=a3263b669347ae6cb6555bc01023c1bff3a1b9d4;hp=35c6b1ef21f0f151d6ed82d73379b26dd60e30ed;hpb=10150f2fb96a248c46b65cea5859d7f1dd11340e;p=kivitendo-erp.git diff --git a/SL/DB/Helper/ConventionManager.pm b/SL/DB/Helper/ConventionManager.pm index 35c6b1ef2..830d34cda 100644 --- a/SL/DB/Helper/ConventionManager.pm +++ b/SL/DB/Helper/ConventionManager.pm @@ -26,4 +26,53 @@ sub auto_manager_base_class { return 'SL::DB::Helper::Manager'; } +sub auto_foreign_key_name +{ + my($self, $f_class, $current_name, $key_columns, $used_names) = @_; + + my $f_meta = $f_class->meta or return $current_name; + my $package_name = SL::DB::Helper::Mappings::get_name_for_table($f_meta->table); + my $name = $package_name || $current_name; + + if(keys %$key_columns == 1) + { + my($local_column, $foreign_column) = %$key_columns; + + # Try to lop off foreign column name. Example: + # my_foreign_object_id -> my_foreign_object + if($local_column =~ s/_$foreign_column$//i) + { + $name = $local_column; + } + else + { + $name = $package_name || $current_name; + } + } + + # Avoid method name conflicts + if($self->method_name_conflicts($name) || $used_names->{$name}) + { + foreach my $s ('_obj', '_object') + { + # Try the name with a suffix appended + unless($self->method_name_conflicts($name . $s) || + $used_names->{$name . $s}) + { + return $name . $s; + } + } + + my $i = 1; + + # Give up and go with numbers... + $i++ while($self->method_name_conflicts($name . $i) || + $used_names->{$name . $i}); + + return $name . $i; + } + + return $name; +} + 1;