Inheritance Mapping =================== Mapped Superclasses ------------------- A mapped superclass is an abstract or concrete class that provides persistent entity state and mapping information for its subclasses, but which is not itself an entity. Typically, the purpose of such a mapped superclass is to define state and mapping information that is common to multiple entity classes. Mapped superclasses, just as regular, non-mapped classes, can appear in the middle of an otherwise mapped inheritance hierarchy (through Single Table Inheritance or Class Table Inheritance). .. note:: A mapped superclass cannot be an entity, it is not query-able and persistent relationships defined by a mapped superclass must be unidirectional (with an owning side only). This means that One-To-Many associations are not possible on a mapped superclass at all. Furthermore Many-To-Many associations are only possible if the mapped superclass is only used in exactly one entity at the moment. For further support of inheritance, the single or joined table inheritance features have to be used. Example: .. code-block:: php `_ is an inheritance mapping strategy where all classes of a hierarchy are mapped to a single database table. In order to distinguish which row represents which type in the hierarchy a so-called discriminator column is used. Example: .. code-block:: php `_ is an inheritance mapping strategy where each class in a hierarchy is mapped to several tables: its own table and the tables of all parent classes. The table of a child class is linked to the table of a parent class through a foreign key constraint. Doctrine 2 implements this strategy through the use of a discriminator column in the topmost table of the hierarchy because this is the easiest way to achieve polymorphic queries with Class Table Inheritance. Example: .. code-block:: php .. code-block:: yaml # user mapping MyProject\Model\User: type: mappedSuperclass # other fields mapping manyToOne: address: targetEntity: Address joinColumn: name: address_id referencedColumnName: id cascade: [ persist, merge ] manyToMany: groups: targetEntity: Group joinTable: name: users_groups joinColumns: user_id: referencedColumnName: id inverseJoinColumns: group_id: referencedColumnName: id cascade: [ persist, merge, detach ] # admin mapping MyProject\Model\Admin: type: entity associationOverride: address: joinColumn: adminaddress_id: name: adminaddress_id referencedColumnName: id groups: joinTable: name: users_admingroups joinColumns: adminuser_id: referencedColumnName: id inverseJoinColumns: admingroup_id: referencedColumnName: id Things to note: - The "association override" specifies the overrides base on the property name. - This feature is available for all kind of associations. (OneToOne, OneToMany, ManyToOne, ManyToMany) - The association type *CANNOT* be changed. - The override could redefine the joinTables or joinColumns depending on the association type. Attribute Override ~~~~~~~~~~~~~~~~~~~~ Override the mapping of a field. Could be used by an entity that extends a mapped superclass to override a field mapping defined by the mapped superclass. .. configuration-block:: .. code-block:: php .. code-block:: yaml # user mapping MyProject\Model\User: type: mappedSuperclass id: id: type: integer column: user_id length: 150 generator: strategy: AUTO fields: name: type: string column: user_name length: 250 nullable: true unique: false #other fields mapping # guest mapping MyProject\Model\Guest: type: entity attributeOverride: id: column: guest_id type: integer length: 140 name: column: guest_name type: string length: 240 nullable: false unique: true Things to note: - The "attribute override" specifies the overrides base on the property name. - The column type *CANNOT* be changed. if the column type is not equals you got a ``MappingException`` - The override can redefine all the column except the type.