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
,或使用相同@Table
的AbstractAction
,但都没有效果.
/**
* @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
以及@Table
from 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表会感觉很难看.
所以,还在寻找更好的方法......
您正在使用joined
继承模型(类表继承),它为父级和每个子级使用单独的表。如果您没有在子类中指定任何字段,Doctrine 将仅创建一个仅包含 ID 字段的表。
并且一个父类只能使用一种继承方式,要么是类表继承,要么是单表继承。
在这种情况下,如果您不想拥有一个仅包含 id 列的表,则需要更改数据模型。