スキーマが無効です。共通のインターフェースを共有していても、回答とコメントは 2 つの異なるオブジェクトであるため、2 つの異なるオブジェクトを使用する必要があります。
2 つのエンティティAnswer
をComment
作成し、それらへの関連付けを作成する必要があります。AbstractContent
これらはほぼ同じものであるため、必要なすべてのフィールドとアクセサ メソッドを定義する抽象クラス を作成できます。Doctrine は継承をサポートしているため、最終的なデータベース スキーマはまったく同じになりますが、オブジェクト指向モデルは正しくなります。
/**
* @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 の継承の詳細については、Doctrine のドキュメント ページを参照してください: Inheritance Mapping