Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 使用非主键值链接symfony实体_Database_Symfony_Doctrine Orm_Doctrine_Symfony4 - Fatal编程技术网

Database 使用非主键值链接symfony实体

Database 使用非主键值链接symfony实体,database,symfony,doctrine-orm,doctrine,symfony4,Database,Symfony,Doctrine Orm,Doctrine,Symfony4,我正在映射一个已经存在的数据库,但这在一开始就设计得很糟糕: |--------------| |----------------------| | Entity A | | Entity B | |--------------| |----------------------| |ID (Int)(PK)| |ID (Int)(PK)| |FOO (Str) | |BAR -> A.FOO (S

我正在映射一个已经存在的数据库,但这在一开始就设计得很糟糕:

|--------------|    |----------------------|
|  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值。我是否必须使用选项Resolver获取值来定制表单,或者使用条令有更简单直接的方法

不能使用指向非主键的联接列。 条令将认为这些是主键,并创建延迟加载 具有数据的代理,这可能导致意外结果。教条 出于性能原因,无法验证此选项的正确性 在运行时设置,但仅通过“验证架构”命令

(来自)

也就是说,我不认为有任何方法可以创建与注释的关联&自动进行引用键验证(或级联定义)。因此,从模式的角度来看,这将导致一种不理想的情况,即在两个表中只有两个未连接的字符串列-这基本上意味着您将需要手动处理更多的事情,而不仅仅是表单处理和验证:比如删除B实例时的检查,基于字符串值等获取“已连接”实体


因此,我理解的底线是:没有办法通过使用教义来“简单地”管理这个问题。简单的解决方案是重构数据库结构,但如果您不选择重构数据库结构,那么恐怕您需要做大量的工作才能使此连接与简单的条令连接一样工作。

好的,谢谢英特尔:)。我觉得这很糟糕。我想我可能要做很多工作才能让它成功。。真的吗?!哈哈。无论如何谢谢你