I’m having a problem with my mapping. I can’t get it to work. I have an abstract base class like so:
/**
* @Entity
* @Table(name="actions")
* @InheritanceType("JOINED")
* @DiscriminatorColumn(name="type", type="string")
* @DiscriminatorMap({"FOO" = "FooAction", "BAR" = "BarAction", ...})
*/
abstract class AbstractAction
{
...
}
I have a bunch of different actions, all with different fields. E.g:
/**
* @Entity
* @Table(name="actions_foo")
*/
class FooAction extends AbstractAction
{
...
}
But one of my actions (BarAction) does not need any extra fields besides those supplied by the AbstractAction. But how can I map that? I tried omitting the @Table, or using the same @Table as the AbstractAction, but to no effect.
/**
* @Entity
* @Table(name="actions")
*/
class BarAction extends AbstractAction
{
...
}
Omitting the @Table gives me a PDOException about a missing table BarAction. Using the @Table of the base class gives me:
PDOException: SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens
So, how do I map this?
Edit: So far I have tried two more things.
I tried removing the @Entity as well as the @Table from BarAction in the hope that this way it would no longer require a database table. That doesn’t work. Instead, I get this error:
Doctrine\ORM\Mapping\MappingException: Class BarAction is not a valid entity or mapped super class.
Next I tried creating an actions_bar table in my database with just a single foreign key column id. Then I mapped the BarAction to it. That works (yay!) but it feels crufty and ugly to have an extra SQL table that I don’t need at all.
So, still looking for a better way…
You are using
joinedinheritance model (class table inheritance), which uses a separate table for parent and each child. If you don’t specify any fields in the child class, Doctrine will just create a table only containing ID field.And a parent class can only use one type of inheritance, either class table inheritance or single table inheritance.
In that case, if you don’t want to have a table with only id column in it, you need to change your data model.