Link 具有非主键值的 symfony 实体

Link symfony entities with a not primary keys value

我正在映射一个已经存在学说的数据库,但首先设计得不好:

|--------------|    |----------------------|
|  Entity A    |    |  Entity B            |
|--------------|    |----------------------|
|ID   (Int)(PK)|    |ID           (Int)(PK)|
|FOO  (Str)    |    |BAR -> A.FOO (Str)    |
|--------------|    |----------------------|

B实体在数据库中存储了A.FOO,而不是A.ID。 因此,如果实体 A 更改 A.FOO,则不会级联到 B 实体。所以我知道这很可怕,但我目前无法更改它们的结构..

有没有办法像这样映射学说?好像我不能因为 A.FOO 不是主键?

IN B ENTITY
/**
 * @ORM\OneToOne(targetEntity="App\Entity\A")
 * @ORM\JoinColumn(name="BAR", referencedColumnName="FOO")
 */

所以最后我想为我的 B 实体创建一个表单,其中的 ChoiceType 包含 A.FOO 值。我是否必须使用 OptionsResolver 获取值来制作自定义表单,或者有更简单直接的方法与学说?

It is not possible to use join columns pointing to non-primary keys. Doctrine will think these are the primary keys and create lazy-loading proxies with the data, which can lead to unexpected results. Doctrine can for performance reasons not validate the correctness of this settings at runtime but only through the Validate Schema command.

(来自 https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/limitations-and-known-issues.html)。

即我不认为有任何方法可以创建与注释的这种关联并具有自动引用密钥验证(或级联定义)。因此,从架构的角度来看,这会给您带来不理想的情况,您在两个表中只有两个未连接的字符串列 - 这基本上意味着您需要处理的不仅仅是表单处理和验证以某种方式手动:比如删除 B 实例时的检查,根据字符串值获取 'connected' 实体等

所以据我了解,底线是:没有办法通过使用学说来管理这个 'simply'。简单的解决方案是重构数据库结构,但如果这不是您的选择,那么恐怕您将需要做很多工作才能使此连接像简单的学说连接一样工作。