2013-02-26 147 views
2

我与旧的数据库工作(自从基础和大量黑客攻击),其中包含一个名为orders_total表,定义如下:学说2单表继承的多对一的关系

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实体许多关系能够拉起每个集合。我试过以下内容:

<?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; 
} 

然后将相应的getter和setters添加到Order类中。

问题是,当我打电话给$order->getOrderCharges()时,它返回整个记录列表,首先是OrderCharge对象。当我拨打$order->getOrderTotals()时,我得到的结果与OrderTotal对象完全相同。

STI允许我只根据@DiscriminatorMap获取正确的对象吗?

+0

您的映射无效:请验证它们。所有这些关系你都不能拥有领域“秩序”。 – Ocramius 2013-02-26 09:03:23

回答

2

尽管(如上所述)的映射是无效的,有根据DQL鉴别列获取的所有实体继承的方式:

SELECT r FROM RootEntity r WHERE r INSTANCE OF SubType 

或只是DQL选择正确的类型:

SELECT e FROM SubType e 

为了您OrderTotal情况下,协会应该是

/** 
* @ORM\OneToMany(targetEntity="OrderTotal", mappedBy="totalOrder") 
* @var \Doctrine\Common\Collections\Collection 
*/ 
protected $orderTotals; 

修复映射并且CLI验证程序确认后(orm:validate-schema),该集合将被正确过滤