我有实体“文章”和“产品”。现在我想为这两个实体添加注释。我应该创建具有相同属性的2个不同实体“ArticleComment”和“ProductComment”,并为其各自的实体构建ManyToOne关系,或者创建单个“Comment”实体并找到一种方法来构建与“Article”和“产品”实体。考虑到解决方案#2,我该怎么做?
答案 0 :(得分:2)
考虑到解决方案#2,我该怎么做?
一种方法是使用Single Table Inheritance
单表继承是一种继承映射策略,其中层次结构的所有类都映射到单个数据库表。为了区分哪一行代表层次结构中的哪种类型,使用了所谓的鉴别器列。
这意味着您可以轻松创建两个单独的实体ArticleComment
和ProductComment
,同时扩展Comment
。然后使用DiscriminatorMap
列提供的优势。
您的Comment
实体可以拥有一个名为parent
的关系,例如可以引用您的Article
或Product
实体。通过创建ArticleComment
或ProductComment
的新实例,您的鉴别器地图字段将根据您使用的类型自动填充。
这也可以让您使用DQL按类型查询相关评论。文档示例:
$query = $em->createQuery('SELECT u FROM Doctrine\Tests\Models\Company\CompanyPerson u WHERE u INSTANCE OF Doctrine\Tests\Models\Company\CompanyEmployee');
还有更多。您可以阅读该章here。当然,这只是一个示例,您可以使用完全不同的方法。