使用以下(简化的)MySQL表定义:
create table items (
item_id int unsigned auto_increment primary key,
purchase_date date
) engine = innodb;
create table computers (
item_id int unsigned primary key,
processor_type varchar(50),
foreign key item_fk (item_id) references items (item_id)
on update restrict on delete cascade
) engine = innodb;
create table printers (
item_id int unsigned primary key,
is_duplex boolean,
foreign key item_fk (item_id) references items (item_id)
on update restrict on delete cascade
) engine = innodb;
作为DBIx::Class的新手,我想模拟数据库实体(计算机和打印机都是项目)之间的继承关系,但是使用提供的belongs_to关系类型,这似乎很尴尬,因为它与基类不是隐藏的,因此必须手动为两个类创建实体,并且对派生类中的基类属性的访问不同于访问它们自己的属性。
是否有一个优雅的解决方案可以让我说:
$printer = $printer_rs->create({purchase_date => $date, is_duplex => 0});
或(在提取的打印机行上):
$date = $printer->purchase_date;
$duplex = $printer->is_duplex;
答案 0 :(得分:6)
您可以使用关系中的proxy
属性来启用访问者 - 它已在DBIx::Class::Relationship::Base的add_relationship
中记录,您可以将其与belongs_to
一起使用,如:< / p>
__PACKAGE__->belongs_to(
'item' => 'MyApp::Schema::Item',
'item_id',
{ proxy => [ qw/purchase_date/ ] }
);
这将使您的所有Printer对象都具有引用相关Item对象的purchase_date
个访问器。
对于create,如果不覆盖new_result
,就不能这样做,这实际上非常简单。您只需要利用与创建相关的行为来转向
->create({
is_duplex => 1,
purchase_date => $dt,
})
到
->create({
is_duplex => 1,
item => {
purchase_date => $dt,
},
})
或者你可以只知道用户item
关闭哪些列,并让他们直接提供hashref;)