Я пытаюсь построить объект с двумя составными внешними ключами, указывающими на один и тот же объект, но они, похоже, имеют одни и те же данные, например, делают объединение только в одном столбце product_id.
class PostpaidProduct extends Product { /** * @ManyToOne(targetEntity="Bundle", fetch="EAGER", cascade={"persist"}) * @JoinColumn(name="bundle_voice_id", referencedColumnName="id") */ private $bundleVoice; /** * @ManyToOne(targetEntity="Bundle", fetch="EAGER", cascade={"persist"}) * @JoinColumn(name="bundle_data_id", referencedColumnName="id") */ private $bundleData; /** * @OneToMany(targetEntity="BundlePromo", mappedBy="product", fetch="EAGER", cascade={"persist"}) * @JoinColumns({ * @JoinColumn(name="id", referencedColumnName="product_id"), * @JoinColumn(name="bundle_voice_id", referencedColumnName="bundle_id") * }) */ private $bundleVoicePromos; /** * @OneToMany(targetEntity="BundlePromo", mappedBy="product", fetch="EAGER", cascade={"persist"}) * @JoinColumns({ * @JoinColumn(name="id", referencedColumnName="product_id"), * @JoinColumn(name="bundle_data_id", referencedColumnName="bundle_id") * }) */ private $bundleDataPromos;
}
Что было бы неправильно с моим картографированием? Возможно ли иметь составные внешние ключи, но без первичных ключей?
Я поговорил с одним из разработчиков Doctrine, и он сказал, что поле @JoinColumns в отношениях @OneToMany игнорируется. Альтернатива будет иметь только один внешний ключ и использовать соответствующие критерии в методе сущности, фильтруя необходимые записи на основе другого ключа. Другое решение будет иметь методы репозитория, предназначенные для получения этих значений.
Кроме того, в отношениях OneToMany нетерпеливая выборка не работает, поэтому она делает отдельные запросы для всех детей. Поэтому, если у вас есть продукт с несколькими ценами, при получении продукта он будет делать отдельные запросы для получения цен.