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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Perl / DBIx :: Class :: Schema :: Loader后缀_2以复制关系名称相关的知识,希望对你有一定的参考价值。

我对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中说:

如果两次提供相同的连接,则它将别名为{rel} _2(类似地第三次)。

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

有一件事,我在原来的问题中没有:工作模型是用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")

你的用户表与自身有一个关键的关键关系,所以因为它的qazxsw poi关系称为qazxsw poi,所以qazxsw poi realtionship命名为has_many

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

我猜想破碎的代码抱怨缺少关系。这将是您需要使用的名称。

但是你为什么要重新生成DBIC的东西而不是juts编辑呢?它不是致力于源代码控制吗?

另一答案

我通过belongs_to在生成器脚本调用中重新映射了错误的名称来修复命名问题。只有两个有问题的连接,所以努力对我来说已经足够了。我知道这不是一般解决方案,但也许它对某人有所帮助。

我像这样使用company_2

company_2

以上是关于Perl / DBIx :: Class :: Schema :: Loader后缀_2以复制关系名称的主要内容,如果未能解决你的问题,请参考以下文章

Perl DBIx::Class - 是不是可以使用列属性为插入提供默认值

使用 DBIx::Class 时如何指定索引长度?

DBIx::Class::Schema::Loader: make_schema_at 没有找到任何关系

DBIx :: Class和重载访问器

如何让 Perl 检测错误的 UTF-8 序列?

使用DBIx :: Connector而不是简单地将mysql_auto_reconnect设置为1有什么好处?