使用doctrine的复合键可以为空的自引用

时间:2015-01-21 09:38:17

标签: php postgresql database-design doctrine-orm doctrine

我对Doctrine ORM 2.5有疑问。当我尝试使用其主键的一部分作为外键的一部分来加载具有可选的ManyToOne引用的实体的实例时,会发生此问题。

该实体如下所示:

class Category
{
    /**
     * @ORM\Id
     * @ORM\ManyToOne(targetEntity="Client")
     * @ORM\JoinColumn(name="client_id", referencedColumnName="client_id"))
     * @var Client
     */
    protected $client;

    /**
     * @ORM\Id
     * @ORM\Column(type="string")
     * @var string
     */
    protected $category_id;

    /**
     * @ORM\ManyToOne(targetEntity="Category")
     * @ORM\JoinColumns({
     *  @ORM\JoinColumn(name="parent_id", referencedColumnName="category_id", nullable=true),
     *  @ORM\JoinColumn(name="client_id", referencedColumnName="client_id", nullable=false)
     * })
     * @var Category
     */
    protected $parent;

    /**
     * @ORM\Column(type="translated")
     * @SAP\Mapping(fieldName="name")
     * @var string
     */
    protected $name;
}

如您所见,某个类别的每个子节点必须与其父节点具有相同的client_id。 问题似乎是Doctrine期望父项存在foreigen key isnt empfy(=至少一个字段具有非null值)。这显然总是正确的,因为FK包含PK的一部分。

有没有办法告诉Doctrine如果parent_id为null,它不应该尝试加载父项?

我看到的唯一选择是通过使用人工自动生成的pk或为parent_client_id添加新列来更改模式,并确保它等于PHP-land中的client_id。

有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

这似乎是此处报告的错误:https://github.com/doctrine/orm/issues/4384

根据对该问题的评论,设置 fetch="EAGER" 解决了学说 Missing value for primary key 错误。不是一个很好的解决方案,但它可能适合您,具体取决于您的用例。