может ли сущность доктрины иметь множественные отношения один-к-одному, где поля и из них похожи? - PullRequest
0 голосов
/ 18 мая 2018
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;
}

Вот мой код (здесь показан только основной код).При переносе этой схемы учение говорит, что индекс уже существует, когда я проверяю в базе данных, что индекс не существует.Потому что доктрина в использовании имен столбцов для генерации индексов, потому что все ассоциации имеют одинаковые столбцы, поэтому доктрина говорит, что индекс уже существует.

Есть ли другой лучший способ сделать это?

1 Ответ

0 голосов
/ 20 мая 2018

Да, есть лучший способ сделать это.

То, что вы пытаетесь сделать, просто не работает, потому что доктрина пытается создать внешний ключ из столбца "order_id" из Orderтаблица сущности , указывающая на каждый из столбцов "order_id" таблиц сущностей Discount, Tax, Payments.

Что вам действительно нужно, это сделать первичный ключ order_id быть внешним ключом, а также первичным ключом в таблицах Discount, Tax and Payments.

Для этого:

Вот код:

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 of Order).
...