我试图构造一个对象,两个复合外键指向同一对象,但它们似乎具有相同的数据,例如只在一列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的一位开发人员交谈过,他说@OneToMany关系中的@JoinColumns字段被忽略了。另一种选择是只有一个外键,并在实体方法中使用匹配标准,根据另一个键过滤所需的条目。另一个解决方案是使用特定于获取这些值的存储库方法。
此外,在onetmany关系中,急切抓取不起作用,所以它对所有子节点进行单独查询。因此,如果你有一个产品有多个价格,当获取一个产品时,它会为获取价格做单独的查询。