次のように定義された、orders_total というテーブルを含むレガシー データベース (osCommerce ベースで、ひどくハッキングされたもの) を使用しています。
CREATE TABLE `orders_total` (
`orders_total_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`orders_id` int(11) unsigned NOT NULL DEFAULT '0',
`title` varchar(255) NOT NULL,
`text` varchar(255) NOT NULL,
`value` decimal(15,4) NOT NULL DEFAULT '0.0000',
`class` varchar(40) NOT NULL,
`sort_order` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`orders_total_id`),
KEY `idx_order_id` (`orders_id`)
);
「クラス」列は、行が表す「合計」のタイプを定義します。一部の「合計」は合計ではなく追加料金であり、一部は割引であるため、少し混乱しています。例:
+-----------------+-----------+--------------+----------+-----------+----------------------+------------+
| orders_total_id | orders_id | title | text | value | class | sort_order |
+-----------------+-----------+--------------+----------+-----------+----------------------+------------+
| 781797 | 190000 | Sub-Total: | $1427.29 | 1427.2916 | ot_subtotal | 1 |
| 781798 | 190000 | Courier: | $172.05 | 172.0500 | ot_shipping | 2 |
| 781799 | 190000 | Insurance: | $47.62 | 47.6200 | ot_insurance | 3 |
| 781800 | 190000 | Visa/MC Fee: | $41.80 | 41.8000 | ot_surcharge_visa_mc | 4 |
| 781801 | 190000 | <b>Total:</b>| $1688.76 | 1688.7616 | ot_total | 10 |
+-----------------+-----------+--------------+----------+-----------+----------------------+------------+
私がやりたいのは、単一テーブルの継承を使用して、テーブル クラスを OrderTotal、OrderCharge、および OrderDiscount エンティティに分割し、Order エンティティとの 1 対多の関係を通じて、各コレクションを取得できるようにすることです。私は次のことを試しました:
<?php
namespace Shop\Entity;
use Application\Entity\BaseEntity;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\InheritanceType("SINGLE_TABLE")
* @ORM\DiscriminatorColumn(name="class", type="string")
* @ORM\DiscriminatorMap({
* "ot_cc_surcharge" = "OrderCharge",
* "ot_coupon" = "OrderDiscount",
* "ot_insurance" = "OrderCharge",
* "ot_payment_surcharge" = "OrderCharge",
* "ot_paypal_surcharge" = "OrderCharge",
* "ot_shipping" = "OrderCharge",
* "ot_subtotal" = "OrderTotal",
* "ot_surcharge" = "OrderCharge",
* "ot_surcharge_amex" = "OrderCharge",
* "ot_surcharge_paypal" = "OrderCharge",
* "ot_surcharge_visa_mc" = "OrderCharge",
* "ot_total" = "OrderTotal"
* })
* @ORM\Table(name="orders_total")
*
*/
class OrderTotalBase extends BaseEntity {
/*....*/
}
/**
* @ORM\Entity
* @ORM\Table(name="orders_total")
*/
class OrderCharge extends OrderTotalBase {
}
/**
* @ORM\Entity
* @ORM\Table(name="orders_total")
*/
class OrderTotal extends OrderTotalBase {
}
/**
* @ORM\Entity
* @ORM\Table(name="orders_total")
*/
class OrderDiscount extends OrderTotalBase {
}
/*....*/
class Order {
/*....*/
/**
* @ORM\OneToMany(targetEntity="OrderTotal", mappedBy="order", fetch="EAGER")
* @var PersistentCollection
*/
protected $orderTotals;
/**
* @ORM\OneToMany(targetEntity="OrderCharge", mappedBy="order", fetch="EAGER")
* @var PersistentCollection
*/
protected $orderCharges;
/**
* @ORM\OneToMany(targetEntity="OrderDiscount", mappedBy="order", fetch="EAGER")
* @var PersistentCollection
*/
protected $orderDiscounts;
}
次に、それぞれのゲッターとセッターを Order クラスに追加しました。
問題は、 を呼び出すと$order->getOrderCharges()
、何よりもレコードのリスト全体がOrderCharge
オブジェクトとして返されることです。呼び出す$order->getOrderTotals()
と、まったく同じ結果が得られますが、OrderTotal
オブジェクトがあります。
STI では、@DiscriminatorMap に従って正しいオブジェクトのみを取得できますか?