Perl / DBIx::Class::Schema::Loader 后缀 _2 来复制关系名称

Perl / DBIx::Class::Schema::Loader suffixes _2 to duplicate relationship name

我是 Perl 的新手,需要维护这个 Catalyst 项目。有一个 MySQL 数据库,通过 DBIx 连接,我需要做一些更改。在我找到的项目的文档中,模型是如何创建的:

dev:~# script/prj_create.pl 
model PrjDB DBIC::Schema 
prj::Schema::PrjDB 
create=static 
preserve_case=1 
moniker_map='sub {return $_[0];}' 
col_accessor_map='sub {return $_[0];}' 
inflect_plural='sub {return $_[0];}' 
inflect_singular='sub {return $_[0];}' 
exclude='^view_' 
components=TimeStamp,PassphraseColumn,DynamicDefault 
use_moose=1 
dbi:mysql:prj root ********

在数据库中有这样的关系

company_user belongs_to company (foreign key)
company_user has_many company_user ("last_changed_by_user")
company_user has_many company (secondary relationship via "last_changed_by_user")

我得到的原始模型在 "company_user.pm" 中创建了以下行:

__PACKAGE__->has_many(
  "company",
  "prj::Schema::PrjDB::Result::company",
  { "foreign.last_changed_by" => "self.id" },
  { cascade_copy => 0, cascade_delete => 0 },
);

__PACKAGE__->belongs_to(
  "company",
  "prj::Schema::PrjDB::Result::company",
  { id => "company" },
  { is_deferrable => 1, on_delete => "CASCADE", on_update => "CASCADE" },
);

如果我现在尝试重新创建我得到的模型:

__PACKAGE__->has_many(
  "company",
  "prj::Schema::PrjDB::Result::company",
  { "foreign.last_changed_by" => "self.id" },
  { cascade_copy => 0, cascade_delete => 0 },
);

__PACKAGE__->belongs_to(
  "company_2",
  "prj::Schema::PrjDB::Result::company",
  { id => "company" },
  { is_deferrable => 1, on_delete => "CASCADE", on_update => "CASCADE" },
);

(注意 belongs_to 包中的“_2”后缀。)

使用此模型时,所有现有代码都会中断,因为它无法再找到某些方法。坦率地说,我真的不知道要搜索什么,所以我希望这里有人能帮助我。

加载程序中是否有我需要设置/取消设置的任何选项,或者它可能甚至不需要对加载程序执行任何操作?


编辑: 到目前为止,我为 {rel}_2 符号找到的唯一东西是在 ResultSet class 中,它说:

If the same join is supplied twice, it will be aliased to {rel}_2 (and similarly for a third time).

我不知道,这是否是我问题的根源以及如何规避它。

有一件事,我在最初的问题中没有:工作模型是使用 2012 年的 DBIx 版本创建的(?我认为,没有记录),我现在使用最新的可用模型。

我建议第二行是你的问题:

company_user belongs_to company (foreign key) 
company_user has_many company_user ("last_changed_by_user") 
company_user has_many company (secondary relationship via "last_changed_by_user")

您的用户 table 与自身有外键关系,因此由于其与自身的 has_many 关系称为 company,因此 belongs_to 关系被命名为 company_2.

我的猜测是以前的版本做了类似的事情,但是程序员编辑了生成的文件以将 company_2 更改为其他名称。

我会猜测损坏的代码是在抱怨缺少关系。这将是您需要使用的名称。

但是为什么要重新生成 DBIC 内容而不是直接编辑它? 它没有致力于源代码管理吗?

我通过 rel_name_map 重新映射生成器脚本调用中的错误名称,解决了命名问题。只有两个有问题的连接,所以我的努力​​就足够了。我知道这不是通用的解决方案,但也许对某人有帮助。

我这样使用 rel_name_map:

dev:~# script/prj_create.pl 
       model PrjDB DBIC::Schema 
       prj::Schema::PrjDB 
       create=static 
       preserve_case=1 
       moniker_map='sub {return $_[0];}' 
       rel_name_map="{company_2 => \"company\", user_2 => \"user\"}"
       col_accessor_map='sub {return $_[0];}' 
       inflect_plural='sub {return $_[0];}' 
       inflect_singular='sub {return $_[0];}' 
       exclude='^view_' 
       components=TimeStamp,PassphraseColumn,DynamicDefault 
       use_moose=1 
       dbi:mysql:prj root ********