ManyToOne从多个实体合并为一个

时间:2017-01-04 19:51:11

标签: doctrine-orm symfony

我有3个实体:

  • 客户端
  • 公司
  • 接触

client个实体可以有多个contact个实体,company个实体也可以有多个contact个实体。

Contact实体看起来像这样:

class ContactDetail
{
    use Timestampable;
    use Bleamable;

    CONST TYPE_EMAIL = 'EMAIL';
    CONST TYPE_PHONE = 'PHONE';
    CONST TYPE_FAX = 'FAX';
    CONST TYPE_MOBILE = 'MOBILE';

    /**
     * @ORM\Id
     * @ORM\Column(type="integer", options={"unsigned"=true})
     * @ORM\GeneratedValue(strategy="AUTO")
     * @Expose
     * @JMS\Groups({"ROLE_USER","ROLE_ADMIN"})
     */
    private $id;

    /**
     * @var string
     * @Assert\NotNull()
     * @ORM\Column(type="string", columnDefinition="ENUM('EMAIL', 'PHONE', 'FAX', 'MOBILE')", nullable=false)
     * @Expose
     * @JMS\Groups({"ROLE_USER","ROLE_ADMIN"})
     */
    private $type;

    /**
     * @var string
     * @ORM\Column(type="string", nullable=false)
     * @Assert\NotBlank(message="Please enter proper value")
     * @Expose
     * @JMS\Groups({"ROLE_USER","ROLE_ADMIN"})
     */
    private $value;
   (...)
   }

问题是:

我应该这样做:

client实体:

/**
 * @ORM\OneToMany(targetEntity="CoreBundle\Entity\ContactDetail", mappedBy="client")
 * @ORM\JoinColumn(name="contactDetail", referencedColumnName="id")
 */
protected $contactDetails;

company实体:

/**
 * @ORM\OneToMany(targetEntity="CoreBundle\Entity\ContactDetail", mappedBy="company")
 * @ORM\JoinColumn(name="contactDetail", referencedColumnName="id")
 */
protected $contactDetails;

哪个会在联系人实体中创建两个额外的列(公司和客户),还是应该以其他方式进行?

实施例。 创建两列:entityNameentityId并以某种方式将其绑定到clientcompany? 如果第二种方式是正确的,请告诉我如何实现这一点。

1 个答案:

答案 0 :(得分:0)

考虑使用从客户和公司到联系人的单向映射来解决此问题。在这种情况下,这是一个小技巧,因为没有使用mappedBy就无法创建OneToMany关系并映射此双向,因此Contact需要有两个列,一个用于公司的客户端。

照顾doctrine documentation,这里的解决方案可能有点奇怪。它使用来自客户和公司的单向的ManyToMany关系。并且您不需要在客户端中使用外键,也不需要在联系人中使用公司netheir。但是必须创建一个新表来介绍这种关系。

简单的方法是在表“Client_Contact”和其他“Company_Contact”上为每个关系创建一个表,每个关联到列,一个用于client_id / company_id,另一个用于contact_id.col