【问题标题】:can a doctrine entity have multiple one to one relationships where from and to fields are similar?一个学说实体可以在 from 和 to 字段相似的情况下具有多个一对一的关系吗?
【发布时间】:2018-10-28 14:17:07
【问题描述】:
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;
}

这是我的代码(这里只显示基本代码)。 当我迁移此架构原则时说索引已经存在,当我签入数据库时​​该索引不存在。 因为教义使用列名生成索引,因为所有关联都有相同的列,这就是教义说索引已经存在的原因。

还有其他更好的方法吗?

【问题讨论】:

  • 我在这里看不到任何索引,除了 id 的隐式索引。你能告诉我们错误吗?
  • 这里JoinColumnreferencedColumn 同名order_id。最好把refencedColumnName改成discount_id,tax_id..

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


【解决方案1】:

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

您正在尝试做的事情,根本行不通,因为教义试图从 Order 实体`s 表中的“order_id”列创建一个 外键,该外键指向每个“order_id” Discount、Tax、Payments 实体表的列。

您真正想要的是将 Order 中的主键 order_id 设置为 外键,同时也是 Discount、Tax 和 Payments 表中的主键。。 p>

要实现这一点:

代码如下:

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 的 Order)。

【讨论】:

    猜你喜欢
    • 2018-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-13
    • 1970-01-01
    • 2023-02-26
    • 1970-01-01
    相关资源
    最近更新 更多