我对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。
有更好的方法吗?
答案 0 :(得分:1)
这似乎是此处报告的错误:https://github.com/doctrine/orm/issues/4384
根据对该问题的评论,设置 fetch="EAGER"
解决了学说 Missing value for primary key
错误。不是一个很好的解决方案,但它可能适合您,具体取决于您的用例。