Ваша схема неверна. У вас должно быть два разных объекта для ответов и комментариев, поскольку это две разные вещи, даже если они имеют общий интерфейс.
Вы должны создать две сущности Answer
и Comment
и создать с ними ассоциации. Поскольку это почти одно и то же, вы можете создать абстрактный класс AbstractContent
, который определяет все необходимые поля и методы доступа. Doctrine поддерживает наследование, поэтому окончательная схема базы данных будет точно такой же, но ваша модель OO будет правильной.
/**
* @MappedSuperclass
* @InheritanceType("SINGLE_TABLE")
* @DiscriminatorColumn(type = "string", name = "discriminator")
* @DiscriminatorMap({ "answer" = "Answer", "comment" = "Comment" })
*/
abstract class AbstractContent {
/** @Column(type = "integer") @Id @GeneratedValue("AUTO") */
protected $id;
/** @Column(type="text") */
protected $content;
/** @Column(type = "datetime", name = "created_at") */
protected $createdAt;
public function __construct() {
$this->createdAt = new \DateTime();
}
}
/** @Entity */
class Answer extends AbstractContent { }
/** @Entity */
class Comment extends AbstractContent { }
/**
* @OneToMany(targetEntity="Cms\Entity\Answer", mappedBy="parent")
*/
private $answers;
/**
* @OneToMany(targetEntity="Cms\Entity\Comment", mappedBy="parent")
*/
private $comments;
Подробнее о наследовании в Doctrine можно узнать на страницах документации: Отображение наследования