В настоящее время я имею структуру модели следующим образом:
/**
* @ORM\Entity
* @ORM\InheritanceType("JOINED")
* @ORM\DiscriminatorColumn(name="related_type", type="string")
* @ORM\DiscriminatorMap({"type_one"="TypeOne", "type_two"="TypeTwo"})
*/
abstract class BaseEntity {
... (all the usual stuff, IDs, etc)
/**
* @ORM\OneToMany(targetEntity="Comment", mappedBy="baseEntity")
*/
private $comments;
}
/**
* @ORM\Entity
*/
class TypeOne extends BaseEntity {
/**
* @ORM\Column(type="string")
*/
private $name;
/**
* @ORM\Column(type="string")
*/
private $description;
}
/**
* @ORM\Entity
*/
class TypeTwo extends BaseEntity {
/**
* @ORM\Column(type="string")
*/
private $name;
/**
* @ORM\Column(type="string")
*/
private $description;
}
/**
* @ORM\Entity
*/
class Comment {
... (all the usual stuff, IDs, etc)
/**
* @ORM\ManyToOne(targetEntity="BaseEntity", inversedBy="comments")
*/
private $baseEntity;
}
Идея здесь заключается в том, чтобы связать комментарий с любой из других таблиц. Кажется, что все работает нормально (предоставлено, я все еще изучаю варианты дизайна, поэтому может быть лучший способ сделать это...), но я заметил, что в подклассах есть некоторые общие поля что я хотел бы перейти в общий родительский класс. Я не хочу переместить их в BaseEntity, так как будут другие объекты, которые являются дочерними элементами BaseEntity, но у них не будет этих полей.
Я рассмотрел создание родительского класса MappedSuperclass посередине, например:
/**
* @ORM\MappedSuperclass
*/
abstract class Common extends BaseEntity {
/**
* @ORM\Column(type="string")
*/
private $name;
/**
* @ORM\Column(type="string")
*/
private $description;
}
/**
* @ORM\Entity
*/
class TypeOne extends Common {}
/**
* @ORM\Entity
*/
class TypeTwo extends Common {}
Я решил, что это сработает, но генератор схемы базы данных доктрины жалуется, что я не могу сопоставить OneToMany в MappedSuperclass. Я не ожидал, что это будет проблемой, поскольку отображение OneToMany все еще находится между корневой базой BaseEntity и комментарием. Есть ли другая структура, которую я должен использовать, или другой способ сделать эти поля общими, не добавляя их в BaseEntity?