Существует несколько различных типов наследования в Doctrine2.Вот примеры двух наиболее распространенных типов:
# MyProject.Model.Person.dcm.yml
MyProject\Model\Person:
type: mappedSuperClass
id:
id:
type: integer
generator:
strategy: AUTO
fields:
name:
type: string
length: 50
...
# MyProject.Model.EmployedPerson.dcm.yml
MyProject\Model\EmployedPerson:
type: entity
fields:
occupation:
type: string
length: 100
...
Затем в ваших классах PHP:
# Person.php
<?php
namespace MyProject\Model;
class Person
{
private $id;
private $name;
// Add public getters and setters
}
# EmployedPerson.php
<?php
namespace MyProject\Model;
class EmployedPerson extends Person
{
private $occupation;
// Add public getters and setters
}
Есть две основные вещи, которые вам нужно сделать, чтобы сделать эту работу: используйте type: mappedSuperClass
вместо type: entity
на родительском и чтобы ваш дочерний класс PHP расширял родительский класс.
Вы можетеДобавьте любые поля и отношения, которые вам нужны, к любому классу, хотя вы должны отметить предупреждение в документах относительно отношений, которые вы можете добавить к родителю:
Сопоставленный суперкласс не может быть сущностью, это неустойчивые к запросу и постоянные отношения, определенные сопоставленным суперклассом, должны быть однонаправленными (только со стороны владельца).Это означает, что связи «один ко многим» вообще не возможны для сопоставленного суперкласса.Более того, ассоциации «многие ко многим» возможны только в том случае, если сопоставленный суперкласс используется только в одном объекте в данный момент.Для дальнейшей поддержки наследования необходимо использовать функции наследования одиночной или объединенной таблицы.
Удобно, документыуже приведем пример конфигурации YAML для наследования одной таблицы:
MyProject\Model\Person:
type: entity
inheritanceType: SINGLE_TABLE
discriminatorColumn:
name: discr
type: string
discriminatorMap:
person: Person
employee: Employee
MyProject\Model\Employee:
type: entity