一个学说实体可以有多个一对一的关系,其中from和to相似?

时间:2018-05-18 07:42:41

标签: symfony indexing doctrine entity-relationship one-to-one

class Order{
    /**
     * @var integer
     *
     * @ORM\Column(name="order_id", type="bigint")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $orderId;

    /**
     * @ORM\OneToOne(targetEntity="OrderDiscount")
     * @ORM\JoinColumn(name="order_id", referencedColumnName="order_id")
     */
    private $discount;

    /**
     * @ORM\OneToOne(targetEntity="OrderTax")
     * @ORM\JoinColumn(name="order_id", referencedColumnName="order_id")
     */
    private $tax;

    /**
     * @ORM\OneToOne(targetEntity="OrderPayments")
     * @ORM\JoinColumn(name="order_id", referencedColumnName="order_id")
     */
    private $payment;
}

class OrderDiscount{
    /**
     * @var integer
     *
     * @ORM\Column(name="order_id", type="bigint")
     * @ORM\Id
     */
    private $id;

    /**
     * @var float
     *
     * @ORM\Column(name="discount", type="float", precision=10, scale=0, nullable=false)
     */
    private $discount;
}

class OrderPayments{
    /**
     * @var integer
     *
     * @ORM\Column(name="order_id", type="bigint", nullable=false)
     * @ORM\Id
     */
    private $id;

    /**
     * @var float
     *
     * @ORM\Column(name="payment_amount", type="float", precision=10, scale=0, nullable=true)
     */
    private $paymentAmount;
}

class OrderTax{
    /**
     * @var integer
     *
     * @ORM\Column(name="order_id", type="bigint", nullable=false)
     * @ORM\Id
     */
    private $id;

    /**
     * @var float
     *
     * @ORM\Column(name="tax_amount", type="float", precision=10, scale=0, nullable=false)
     */
    private $taxAmount;
}

这是我的代码(这里只显示基本代码)。 当我迁移这个架构时,一个索引已经存在,当我在数据库中检查索引不存在时。 因为使用列名生成索引的学说,因为所有关联都有相同的列,这就是为什么doctrine说索引已经存在。

还有其他更好的方法吗?

1 个答案:

答案 0 :(得分:0)

是的,有更好的方法可以做到这一点。

您尝试做什么,根本不起作用,因为doctrine尝试从Order实体表的“order_id”列创建一个外键,指向每个“order_id”折扣,税,付款实体表的列。

您真正想要的是使主键order_id 成为外键,也是折扣,税和付款表中的主键。

实现这一目标:

以下是代码:

class Order{
    /**
     * @var integer
     *
     * @ORM\Column(name="order_id", type="bigint")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $orderId;

    /**
     * @ORM\OneToOne(targetEntity="OrderDiscount", mappedBy="orderId")
     */
    private $discount;

    /**
     * @ORM\OneToOne(targetEntity="OrderTax")
     * @ORM\JoinColumn(name="order_id", referencedColumnName="order_id")
     */
    private $tax;

}

class OrderDiscount{
    /**
     * @var integer
     *
     * @ORM\OneToOne(targetEntity="Order", inversedBy="discount")
     * @ORM\JoinColumn(name="order_id", referencedColumnName="order_id")
     * @ORM\Id
     */
    private $orderId;


    /**
     * @var float
     *
     * @ORM\Column(name="discount", type="float", precision=10, scale=0, nullable=false)
     */
    private $discount;
}

class OrderTax{
    /**
     * @var integer
     *
     * @ORM\OneToOne(targetEntity="Order", inversedBy="tax")
     * @ORM\JoinColumn(name="order_id", referencedColumnName="order_id")
     * @ORM\Id
     */
    private $orderId;

    /**
     * @var float
     *
     * @ORM\Column(name="tax_amount", type="float", precision=10, scale=0, nullable=false)
     */
    private $taxAmount;
}

请注意

  • ORM\JoinColumn用于拥有方,因此您不需要此订单实体关系字段定义。
  • 您在折扣,税金,付款方面不需要@ORM\Column(name="order_id", type="bigint", nullable=false),因为它被定义为外键,它将被创建为与其“指向”的列相同的类型(在本例中为订单的order_id) )。