4

使用以下(简化的)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;

?

4

1 回答 1

6

您可以使用proxy关系上的属性来启用访问器 - 它记录在add_relationshipDBIx ::Class::Relationship::Base中,您可以将其与以下内容一起使用belongs_to

__PACKAGE__->belongs_to(
  'item' => 'MyApp::Schema::Item',
  'item_id',
  { proxy => [ qw/purchase_date/ ] }
);

这将使您的所有 Printer 对象都具有purchase_date引用关联 Item 对象的访问器。

至于创建,如果不覆盖就无法做到new_result,这实际上很容易。你只需要利用 create-from-related 行为来转向

->create({
  is_duplex => 1,
  purchase_date => $dt,
})

进入

->create({
  is_duplex => 1,
  item => {
    purchase_date => $dt,
  },
})

或者,您可以将有关哪些列的信息强加给item您的用户,并让他们直接提供该 hashref ;)

于 2010-07-31T09:41:44.647 回答