代码之家  ›  专栏  ›  技术社区  ›  Antoine Nedelec

用非主键值链接symfony实体

  •  -1
  • Antoine Nedelec  · 技术社区  · 5 年前

    我正在映射一个已经存在于条令中的数据库,但首先设计得很差:

    |--------------|    |----------------------|
    |  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值。我必须用 选择解析器 获取价值观,还是有更简单直接的方法与学说?

    1 回复  |  直到 5 年前
        1
  •  0
  •   ejuhjav    5 年前

    不能使用指向非主键的联接列。 条令会认为这些是主要的关键,会造成延迟加载 带有数据的代理,这可能导致意外的结果。教条 由于性能原因,不能验证此项的正确性 在运行时设置,但只能通过validate schema命令。

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

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

    所以,我理解的底线是:没有办法用信条来“简单”地管理这个问题。简单的解决方案是重构数据库结构,但如果这不是您的一个选择,那么恐怕您将有相当多的工作要做,以使这个连接像简单的条令连接那样工作。