我有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;
哪个会在联系人实体中创建两个额外的列(公司和客户),还是应该以其他方式进行?
实施例。
创建两列:entityName
和entityId
并以某种方式将其绑定到client
和company
?
如果第二种方式是正确的,请告诉我如何实现这一点。
答案 0 :(得分:0)
考虑使用从客户和公司到联系人的单向映射来解决此问题。在这种情况下,这是一个小技巧,因为没有使用mappedBy就无法创建OneToMany
关系并映射此双向,因此Contact需要有两个列,一个用于公司的客户端。
照顾doctrine documentation,这里的解决方案可能有点奇怪。它使用来自客户和公司的单向的ManyToMany关系。并且您不需要在客户端中使用外键,也不需要在联系人中使用公司netheir。但是必须创建一个新表来介绍这种关系。
简单的方法是在表“Client_Contact”和其他“Company_Contact”上为每个关系创建一个表,每个关联到列,一个用于client_id / company_id,另一个用于contact_id.col