Doctrine多个复合外键

时间:2013-04-02 11:35:45

标签: php doctrine-orm

我正在尝试使用指向同一对象的两个复合外键来构造一个对象,但它们似乎具有相同的数据,例如仅在一列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;

}

我的映射会出现什么问题? 是否可以使用复合外键但不能成为主键?

1 个答案:

答案 0 :(得分:0)

我和Doctrine的一位开发人员谈过,他说@OneToMany关系中的@JoinColumns字段被忽略了。替代方案是只有一个外键并在实体方法中使用匹配标准,根据另一个键过滤所需的条目。另一种解决方案是使用特定于获取这些值的存储库方法。

此外,在OneToMany关系中,急切提取不起作用,因此它会对所有子节点进行单独查询。因此,如果您的产品具有多种价格,那么在获取产品时,它会针对获取价格进行单独查询。