3

我正在尝试将 Class::DBI 与一个简单的单亲 -> 可能与孩子的关系一起使用:

Data::Company->table('Companies');
Data::Company->columns(All => qw/CompanyId Name Url/);
Data::Company->has_many(offers => 'Data::Offer'=>'CompanyId'); # =>'CompanyId'

Data::Offer->table('Offers');
Data::Offer->columns(All => qw/OfferId CompanyId MonthlyPrice/);
Data::Offer->has_a(company => 'Data::Company'=>'CompanyId');

我尝试添加新记录:

my $company = Data::Company->insert({ Name => 'Test', Url => 'http://url' });
my $offer = $company->add_to_offers({  MonthlyPrice => 100 });

但我得到:

Can't locate object method "add_to_offers" via package "Data::Company"

我查看了古典 Music::CD 示例,但我无法弄清楚我做错了什么。

4

3 回答 3

4

我同意 Manni 的观点,如果你的包声明在同一个文件中,那么你需要先has_a()定义具有关系的类。否则,如果它们位于不同的源文件中,则文档说明:

Class::DBI 通常应该能够做正确的事情,只要所有类在“使用”任何其他类之前都继承 Class::DBI。

至于三参数形式,你做得很好。第三个参数has_many()是外部类中的列,它是该类的外键。也就是说,Offer有 a CompanyIdwhich 指向Company's CompanyId

于 2009-01-30T12:31:44.683 回答
2

谢谢

好吧,问题实际上不是我的代码,而是我的设置。今天早上打开我的电脑后,我意识到:* 服务器上的 Apache + mod_perl * SMB 挂载

当我对几个文件进行更改时,并非所有更改似乎都由 mod_perl 加载。重新启动 Apache 解决了这个问题。实际上,我过去曾看到过客户端和 SMB 服务器的时间不同步的此类问题。

上面的代码适用于每个模块的 1 个文件。

谢谢

于 2009-01-30T18:03:33.903 回答
1

我真的没有太多使用 Class:DBI 的经验,但无论如何我都会试一试:

  1. 文档指出:“必须先定义具有 has_a() 的类,然后再定义具有 has_many() 的类”。
  2. 我找不到任何关于您使用 has_a 和 has_many 方式的参考,其中三个参数在您的情况下始终为“CompanyId”。
于 2009-01-30T10:48:36.950 回答