Symfony / PHP - 表单类型类

时间:2015-12-14 20:21:50

标签: php symfony doctrine symfony-forms symfony-2.7

我有以下问题。实体付款代表付款方式。所以我可以举例说:'信用卡' 2欧元的费用,' PayPal' 1.50欧元等等。

然后我有实体 OrderPaymentItem ,它存储电子商店订单中使用的付款方式。为什么?我需要为每个电子商店订单存储付款,因为当我更改付款费用时,它使用客户在他/她完成订单时使用的费用...如果我将付款直接连接到订单实体而不是OrderPaymentItem,它重新计算旧订单,这是错误的。当你改变费用时,它应该只在新订单中改变......但我不知道如何纠正它。首先看看这两个类:

第一个实体是付款

class Payment
{
    protected $id;
    protected $method;
    protected $fee;

    /**
     * Get id
     *
     * @return integer
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set fee
     *
     * @param integer $fee
     * @return Payment
     */
    public function setFee($fee)
    {
        $this->fee = $fee;

        return $this;
    }

    /**
     * Get fee
     *
     * @return integer
     */
    public function getFee()
    {
        return $this->fee;
    }

    /**
     * Set method
     *
     * @param string $method
     * @return Payment
     */
    public function setMethod($method)
    {
        $this->method = $method;

        return $this;
    }

    /**
     * Get method
     *
     * @return string
     */
    public function getMethod()
    {
        return $this->method;
    }
}


AppBundle\Entity\Payment:
    type: entity
    table: payment
    id:
        id:
            type: integer
            generator:
                strategy: AUTO
    fields:
        method:
            column: method
            type: string
            nullable: false
            unique: true
            length: 64
        fee:
            column: fee
            type: integer
            nullable: false

第二个实体是 OrderPaymentItem

class OrderPaymentItem
{
    protected $id;
    protected $method;
    protected $fee;
    protected $paymentId;

    /**
     * Get id
     *
     * @return integer
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set fee
     *
     * @param integer $fee
     * @return Payment
     */
    public function setFee($fee)
    {
        $this->fee = $fee;

        return $this;
    }

    /**
     * Get fee
     *
     * @return integer
     */
    public function getFee()
    {
        return $this->fee;
    }

    /**
     * Set method
     *
     * @param string $method
     * @return Payment
     */
    public function setMethod($method)
    {
        $this->method = $method;

        return $this;
    }

    /**
     * Get method
     *
     * @return string
     */
    public function getMethod()
    {
        return $this->method;
    }

    /**
     * Set paymentId
     *
     * @param \AppBundle\Entity\Payment $paymentId
     * @return OrderDiscountItem
     */
    public function setPaymentId(\AppBundle\Entity\Payment $paymentId = null)
    {
        $this->paymentId = $paymentId;

        return $this;
    }

    /**
     * Get paymentId
     *
     * @return \AppBundle\Entity\Payment
     */
    public function getPaymentId()
    {
        return $this->paymentId;
    }
}


AppBundle\Entity\OrderPaymentItem:
        type: entity
        table: order_payment_item
        id:
            id:
                type: integer
                generator:
                    strategy: AUTO
        fields:
            method:
                column: method
                type: string
                nullable: false
                length: 64
            fee:
                column: fee
                type: integer
                nullable: false
        manyToOne:
            paymentId:
                targetEntity: AppBundle\Entity\Payment
                joinColumn:
                    name: payment_id
                    referencedColumnName: id
                    onDelete: SET NULL
                    nullable: true

最初我有以下篮子形式的表单构建器:

$builder->add('payment', 'entity', [
              'label' => 'Platba',
              'class' => 'AppBundle:Payment',
              'data_class' => 'AppBundle\Entity\Payment',
              'property' => 'method',
              'multiple' => false,
              'expanded' => true
]);

你可以看到这两个类几乎相同。只有OrderPaymentItem包含与付款的关系 - 不是必需的,但有利于后向兼容性。

我现在需要更正它并使用OrderPaymentItem而不是Payment。我需要使用付款清单,但将其保存为OrderPaymentItem。

有人能帮助我吗?

1 个答案:

答案 0 :(得分:0)

由于这两个类几乎相同,因此您可以使用Doctrine discriminator

Take a look at this

  

使用鉴别器映射时,例如,如果使用单表继承,则“映射实体”将扩展基本实体。

This should help you

P.S:我希望现在还不晚......