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 :: Basebelongs_toに文書化されており、次のように使用できます。

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

これにより、すべてのPrinterオブジェクトpurchase_dateに、関連付けられたItemオブジェクトを参照するアクセサーが含まれるようになります。

createに関しては、オーバーライドせずにそれを行うことはできませんnew_result。これは実際には非常に簡単です。ターンするには、create-from関連の動作を利用する必要があります

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

の中へ

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

または、ユーザーのどの列がitemオフになっているのかを知って、そのハッシュ参照を直接提供してもらうこともできます;)

于 2010-07-31T09:41:44.647 に答える