我正在映射一个已经存在该学说的数据库,但是这在开始时就设计得很糟糕:
|--------------| |----------------------|
| 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 来获取值来制作自定义表单,或者使用教义有更简单的直接方法?
答案 0 :(得分:0)
不可能使用指向非主键的联接列。 主义会认为这些是主键,并会造成延迟加载 用数据代理,这可能导致意外结果。教义 出于性能原因可能无法验证此方法的正确性 在运行时进行设置,但只能通过“验证架构”命令进行。
即我认为没有任何方法可以使用批注创建此关联并具有自动引用键验证(或级联定义)。因此,从架构的角度来看,这将使您处于非理想的情况,即在两个表中只有两个未连接的字符串列-这基本上意味着您将需要处理更多的事情,而不仅仅是表单处理和验证手动操作:例如在删除B实例时进行检查,根据字符串值获取“已连接”实体等。
因此,据我了解,最重要的是:没有办法通过使用学说来“简单”地管理这一问题。简单的解决方案是重构数据库结构,但是如果这不是您的选择,那么恐怕您需要做很多工作才能使此连接像简单的理论连接一样工作。