Symfony 3 - 与同一数据模型的多个关系

时间:2017-09-08 08:45:20

标签: symfony

我在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个关系。所以我想知道,什么是正确的方法?

一方面,我可以保持原样,因为它确实有效。但同样,如果某些信息在两个字段中都是相同的,那么有两个数据库条目具有完全相同的信息似乎有点浪费,并且之后也难以保留。

是否有更智能的方法来解决这个问题?

1 个答案:

答案 0 :(得分:0)

您可以使用例如Single Table Inheritance

通过这种方式,您只需定义EmailForwardParticipationRequest的结构一次,所有数据将保存在数据库的一个表中。在ORM映射期间,Doctrine将识别您正在使用的类型并为您实例化正确的对象。

我不知道如何解决这两种关系中的数据是否相同的问题,它会被两次排除。因为

  1. 如果它总是一样的话你就不需要两个关系

  2. 没有真正的方法可以将其保留在一个持久性中 - 我看到的唯一选择是创建来自EmailForwardParticipationRequest的另一个关系,它保留了可能需要两次的数据。然后从两个对象引用。