Doctrine Custom Discriminator map

时间:2018-06-04 22:54:47

标签: symfony doctrine-orm

所以我正在努力将Symfony 3集成到遗留代码库中,而且大多数情况下一切都很好。不幸的是,我遇到了单表继承与一个时髦的鉴别器的问题。注意:我无法更改架构(至少很快就会这样),因为它与许多旧代码捆绑在一起。

我有经典人物 - >员工映射。有了这个我有2个表:

  • 公司

转换为3个实体

  • 公司
    • 员工

这似乎很简单,除了唯一可行的鉴别器是company_id,它是一个人的列,表示该人所属的公司。如果company_id = 1则是员工,否则只是一个普通人。

据我所知,我需要一张看起来像这样的地图:

/**
 * @InheritanceType( "SINGLE_TABLE" )
 * @DiscriminatorColumn( name = "company_id", type = "integer" )
 * @ORM\DiscriminatorMap({
 *      1 = "Employee",
 *      2 = "Person",
 *      3 = "Person",
 *      ...
 *      5001 = "Person"
 *   })
 *
 * @ORM\Table(name="person")
 * @ORM\Entity
 */
class Person
{}

这种映射方式无法维持。我环顾四周,但我没有找到一个很好的解决方案。现在我使用Mapped超类,然后将Person和Employee都指向person表,这是从代码的角度来看,但如果我运行schema验证它已经存在由于表名而导致的错误。这使得维护映射变得更加困难。

1 个答案:

答案 0 :(得分:0)

老实说,我不确定这样的事情是否可行,因为生成的查询会有点疯狂(特别是如果你有很多记录)。

另一个想法是如何解决它,添加新列(不应该影响旧应用程序,因为它不会更改任何当前字段)将使用触发器填充并使用此作为鉴别器。如果不可能,请考虑使用新字段创建视图作为鉴别器。