当一个子类没有额外属性时,Doctrine表类继承

San*_*hal 16 php inheritance doctrine-orm

我的映射有问题.我无法让它发挥作用.我有一个像这样的抽象基类:

/**
 * @Entity
 * @Table(name="actions")
 * @InheritanceType("JOINED")
 * @DiscriminatorColumn(name="type", type="string")
 * @DiscriminatorMap({"FOO" = "FooAction", "BAR" = "BarAction", ...})
 */
abstract class AbstractAction
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

我有很多不同的动作,都有不同的领域.例如:

/**
 * @Entity
 * @Table(name="actions_foo")
 */
class FooAction extends AbstractAction
{
   ...
}
Run Code Online (Sandbox Code Playgroud)

但我的一个动作(BarAction)不需要任何额外的字段,除了由AbstractAction.提供的字段.但是我该如何映射呢?我试着省略@Table,或使用相同@TableAbstractAction,但都没有效果.

/**
 * @Entity
 * @Table(name="actions")
 */
class BarAction extends AbstractAction
{
   ...
}
Run Code Online (Sandbox Code Playgroud)

省略@Table给我一个PDOException关于丢失的表BarAction.使用@Table基类给我:

PDOException: SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens
Run Code Online (Sandbox Code Playgroud)

那么,我该如何映射呢?

编辑:到目前为止,我已经尝试了两件事.

我试图删除@Entity以及@Tablefrom BarAction以希望这种方式它不再需要数据库表.这不起作用.相反,我收到此错误:

Doctrine\ORM\Mapping\MappingException: Class BarAction is not a valid entity or mapped super class.
Run Code Online (Sandbox Code Playgroud)

接下来,我尝试actions_bar使用一个外键列在我的数据库中创建一个表id.然后我映射BarAction到它.这是有效的(耶!)但是有一个我根本不需要的额外SQL表会感觉很难看.

所以,还在寻找更好的方法......

Hak*_*yal 2

您正在使用joined继承模型(类表继承),它为父级和每个子级使用单独的表。如果您没有在子类中指定任何字段,Doctrine 将仅创建一个仅包含 ID 字段的表。

并且一个父类只能使用一种继承方式,要么是类表继承,要么是单表继承。

在这种情况下,如果您不想拥有一个仅包含 id 列的表,则需要更改数据模型。