首先,我想提前道歉问题标题,因为理想情况下可能无法解释我要处理的情况。我已经做了一些研究,但没有找到合适的解决方案的运气。
我的案件:
我有一个实体,例如一项活动,该活动代表了我网站上客户执行的活动的活动。它可能是一种不同的类型,例如:page_view,注释,登录,购买等。我要做的是将补充数据分配给每个活动,例如。对于评论活动,补充数据将是评论实体,用于购买一系列产品实体。 目前,我只是将活动类型定义为ActivityInterface中的常数,然后使用该值来获取能够从HTTP请求中提供的参数中解析正确的实体/实体的EntityManager实例。该解决方案有很多缺点,我不确定这是事件是否正确的方法。
你们可以通过给我一些提示或将我重定向到一些有用的出版物,以帮助我吗?谢谢。
我建议使用类似的映射超类:
/** @MappedSuperclass */
class Activity
{
/** @Id @Column(type="integer") */
protected $id;
/** @Column(type="string") */
protected $generalActivityProperty;
// ... more fields and methods
}
/** @Entity */
class Comment extends Activity
{
/** @ManyToOne(targetEntity='CommentEntity') */
private $commentEntity;
// ... more fields and methods
}
/** @Entity */
class Purchase extends Activity
{
/** @OneToMany(targetEntity='ProductAssociations') */
private $products;
// ... more fields and methods
}
这将创建每个类别的单个表(但不是为"活动"),每个表都包含"活动"中定义的所有字段/方法以及特定类中定义的其他字段/方法。
您甚至可以通过entityManager->getRepository('Acticity')->find()
查询所有活动,例如并获取评论列表,pageview等。返回对象。
它没有经过测试,但是您应该知道如何做。
您还可以使用Single Table Inheritance
或Class Table Inheritance
。在这里检查一下。
但我想在您的情况下,映射的超类应该是完美的。