首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Doctrine2多级单表继承(未知列)

Doctrine2多级单表继承(未知列)
EN

Stack Overflow用户
提问于 2015-09-01 12:47:20
回答 2查看 788关注 0票数 1

我不确定这是bug还是代码中的错误:

代码语言:javascript
复制
<?php
namespace MyProject\Model;

/**
 * @Entity
 * @InheritanceType("SINGLE_TABLE")
 * @DiscriminatorColumn(name="discr", type="string")
 * @DiscriminatorMap({
 *      "customer" = "Customer", 
 *      "projectManager" = "ProjectManager", 
 *      "developer" = "Developer"
 * })
 */
abstract class Person
{
    // ...
}

/**
 * @Entity
 */
class Customer extends Person
{
    // ...
}

/**
 * @Entity
 */
abstract class Employee extends Person
{
    /**
     * @var boolean
     * @Column(name="retired", type="boolean", nullable=true)
     */
    protected $retired;
}

/**
 * @Entity
 */
class ProjectManager extends Employee
{
    // ...
}

/**
 * @Entity
 */
class Developer extends Employee
{
    // ...
}

当尝试更新数据库时,app/console doctrine:schema:update --force原则会忽略Employee::退休属性,并且应用程序会导致错误:未知列“退休”

如果我手动创建该列,所有内容都将按预期的方式工作。而且,这种情况只发生在单个表中,因此如果切换到类表继承,则在模式更新时创建列。

EN

回答 2

Stack Overflow用户

发布于 2015-09-01 14:15:27

您不能“跳转”到最低级别的继承,您必须描述每个级别。

至少它适用于@InheritanceType("JOINED"),我想SINGLE_TABLE也是如此。

代码语言:javascript
复制
<?php
namespace MyProject\Model;

/**
 * @Entity
 * @InheritanceType("SINGLE_TABLE")
 * @DiscriminatorColumn(name="discr", type="string")
 * @DiscriminatorMap({
 *      "customer"       = "Customer", 
 *      "employee"       = "Employee",
 *      "projectManager" = "ProjectManager", 
 *      "developer"      = "Developer"
 * })
 */
abstract class Person
{
    // ...
}

/**
 * @Entity
 */
class Customer extends Person
{
    // ...
}

/**
 * @Entity
 * @InheritanceType("SINGLE_TABLE")
 * @DiscriminatorColumn(name="discr", type="string")
 * @DiscriminatorMap({
 *      "employee"       = "Employee", 
 *      "projectManager" = "ProjectManager", 
 *      "developer"      = "Developer"
 * })
 */
abstract class Employee extends Person
{
    /**
     * @var boolean
     * @Column(name="retired", type="boolean", nullable=true)
     */
    protected $retired;
}

/**
 * @Entity
 */
class ProjectManager extends Employee
{
    // ...
}

/**
 * @Entity
 */
class Developer extends Employee
{
    // ...
}
票数 1
EN

Stack Overflow用户

发布于 2016-09-04 19:22:33

您不必在根实体的区分器映射中映射您的中间抽象实体,这样才能使其工作。不要把它变成一个@Entity,而是一个@MappedSuperclass

在您的例子中,Employee应该是一个@MappedSuperclass,所有扩展Employee的东西都应该是在映射中表示的@Entity

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32332067

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档