Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Doctrine orm 原则2多对一关系中的单表继承_Doctrine Orm - Fatal编程技术网

Doctrine orm 原则2多对一关系中的单表继承

Doctrine orm 原则2多对一关系中的单表继承,doctrine-orm,Doctrine Orm,我使用的是一个遗留数据库(基于osCommerce且受到严重攻击),其中包含一个名为orders_total的表,定义如下: 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`

我使用的是一个遗留数据库(基于osCommerce且受到严重攻击),其中包含一个名为orders_total的表,定义如下:

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         |
+-----------------+-----------+--------------+----------+-----------+----------------------+------------+
+-----------------+-----------+--------------+----------+-----------+----------------------+------------+
|订单|总数|订单| id |标题|文本|值|类别|排序||
+-----------------+-----------+--------------+----------+-----------+----------------------+------------+
|781797 | 190000 |小计:| 1427.29 | 1427.2916 | ot | U小计| 1|
|781798 | 190000 |快递:| 172.05 | 172.0500 | ot|U shipping | 2|
|781799 | 190000 |保险:47.62 | 47.6200 | OTU保险| 3|
|781800 | 190000 | Visa/MC费用:| 41.80 | 41.8000 | ot |附加费| Visa | MC | 4|
|781801 | 190000 |总计:| 1688.76 | 1688.7616 | OTU总计| 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;
}
虽然(如上所述)映射无效,但有一种方法可以根据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
*/
受保护的$orderTotals;

修复映射并由CLI验证程序确认后(
orm:validate schema
),将正确筛选该集合

您的映射无效:请验证它们。不能让field
order
作为所有这些关系的拥有方。