我在Symfony 3中有以下代码:
课程Appointment
<?php
/**
* Appointment
*
* @ORM\Entity
* @ORM\Table(name="ev_appointment")
*/
class Appointment
{
/**
* @ORM\OneToMany(targetEntity="EmailForward", mappedBy="_appointment")
*/
private $_email_forwards;
/**
* @ORM\OneToMany(targetEntity="ParticipationRequest", mappedBy="_appointment")
*/
private $_participation_requests;
}
课程EmailForward
<?php
/**
* @ORM\Entity
* @ORM\Table(name="ev_email_forward")
*/
class EmailForward
{
/**
* @ORM\ManyToOne(targetEntity="Appointment" , inversedBy="_email_forwards")
* @ORM\JoinColumn(name="ev_appointment_id", referencedColumnName="id")
*/
private $_appointment;
/**
* @ORM\Column(type="string", length=255, name="email", nullable=true)
*/
private $_email;
/**
* @ORM\Column(type="datetime", name="forwarded_at", nullable=true)
*/
private $_forwarded_at;
/**
* @ORM\Column(type="string", length=255, name="source", nullable=true)
*/
private $_source;
}
课程ParticipationRequest
<?php
/**
* @ORM\Entity
* @ORM\Table(name="ev_participation_request")
*/
class ParticipationRequest
{
/**
* @ORM\ManyToOne(targetEntity="Appointment", inversedBy="_participation_requests")
* @ORM\JoinColumn(name="ev_appointment_id", referencedColumnName="id")
*/
private $_appointment;
/**
* @ORM\Column(type="string", length=255, name="email", nullable=true)
*/
private $_email;
/**
* @ORM\Column(type="datetime", name="forwarded_at", nullable=true)
*/
private $_forwarded_at;
/**
* @ORM\Column(type="string", length=255, name="source", nullable=true)
*/
private $_source;
}
现在在我看来,我与2个具有完全相同结构的实体有2个关系。所以我想知道,什么是正确的方法?
一方面,我可以保持原样,因为它确实有效。但同样,如果某些信息在两个字段中都是相同的,那么有两个数据库条目具有完全相同的信息似乎有点浪费,并且之后也难以保留。
是否有更智能的方法来解决这个问题?
答案 0 :(得分:0)
您可以使用例如Single Table Inheritance
通过这种方式,您只需定义EmailForward
和ParticipationRequest
的结构一次,所有数据将保存在数据库的一个表中。在ORM映射期间,Doctrine将识别您正在使用的类型并为您实例化正确的对象。
我不知道如何解决这两种关系中的数据是否相同的问题,它会被两次排除。因为
如果它总是一样的话你就不需要两个关系
没有真正的方法可以将其保留在一个持久性中 - 我看到的唯一选择是创建来自EmailForward
和ParticipationRequest
的另一个关系,它保留了可能需要两次的数据。然后从两个对象引用。