我正在映射一个已经存在的带有条令的数据库,但这在一开始就设计得很糟糕:
|--------------| |----------------------|
| 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
/**
* @ORMOneToOne(targetEntity="AppEntityA")
* @ORMJoinColumn(name="BAR", referencedColumnName="FOO")
*/
所以最后我想为我的B实体创建一个表单,其中ChoiceType包含a.FOO值。我必须用OptionsResolver获取值来制作自定义表单吗?还是有更简单直接的方法来获取原则?
不可能使用指向非主键的联接列。教条会认为这些是主要的关键,并造成懒惰的负载代理,这可能会导致意外的结果。教条由于性能原因无法验证此项的正确性设置,但只能通过"验证架构"命令。
(来自https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/limitations-and-known-issues.html)。
也就是说,我不认为有任何方法可以创建这种与注释的关联&具有自动引用密钥验证(或级联定义)。因此,从模式的角度来看,这将给您留下一个不理想的情况,即在两个表中只有两个不连接的字符串列,这基本上意味着您将需要处理更多的事情,而不仅仅是表单处理&手动验证:比如删除B实例时的检查,根据字符串值提取"连接"实体等。
因此,我所理解的底线是:没有办法"简单地"通过使用学说来管理这一点。简单的解决方案是重构数据库结构,但如果这不是你的选择,那么我担心你将有相当多的工作要做,以使这个连接像简单的原则连接一样工作