2

次のように定義された、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 に従って正しいオブジェクトのみを取得できますか?

4

1 に答える 1

3

(上で説明したように) マッピングは無効ですが、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)、そのコレクションは正しくフィルタリングされます。

于 2013-02-26T09:14:04.593 に答える