Doctrine orm 从多个实体到一个实体的多个实体
我有3个实体:Doctrine orm 从多个实体到一个实体的多个实体,doctrine-orm,symfony,Doctrine Orm,Symfony,我有3个实体: 客户 公司 接触 客户实体可以有多个联系人实体,公司也可以有多个联系人实体 联系人实体如下所示: class ContactDetail { use Timestampable; use Bleamable; CONST TYPE_EMAIL = 'EMAIL'; CONST TYPE_PHONE = 'PHONE'; CONST TYPE_FAX = 'FAX'; CONST TYPE_MOBILE = 'MOBILE';
- 客户
- 公司
- 接触
客户
实体可以有多个联系人
实体,公司也可以有多个联系人
实体
联系人
实体如下所示:
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;
(...)
}
问题是:
我是否应该这样做:
客户
实体:
/**
* @ORM\OneToMany(targetEntity="CoreBundle\Entity\ContactDetail", mappedBy="client")
* @ORM\JoinColumn(name="contactDetail", referencedColumnName="id")
*/
protected $contactDetails;
/**
* @ORM\OneToMany(targetEntity="CoreBundle\Entity\ContactDetail", mappedBy="company")
* @ORM\JoinColumn(name="contactDetail", referencedColumnName="id")
*/
protected $contactDetails;
公司
实体:
/**
* @ORM\OneToMany(targetEntity="CoreBundle\Entity\ContactDetail", mappedBy="client")
* @ORM\JoinColumn(name="contactDetail", referencedColumnName="id")
*/
protected $contactDetails;
/**
* @ORM\OneToMany(targetEntity="CoreBundle\Entity\ContactDetail", mappedBy="company")
* @ORM\JoinColumn(name="contactDetail", referencedColumnName="id")
*/
protected $contactDetails;
这将在联系人实体中创建两个附加列(公司和客户),还是我应该以其他方式创建
前。
创建两列:entityName
和entityId
,并以某种方式将其绑定到客户端
和公司
?
如果第二种方法是正确的,请告诉我如何实现这一点。考虑使用客户和公司的单向地图来联系解决这一问题。在这种情况下,这是一个小技巧,因为如果不使用mappedBy和映射此双向关系,就无法创建
OneToMany
关系,因此联系人需要有这两列,一列为客户,另一列为公司
照顾好孩子,解决办法可能有点奇怪。这是一种来自客户和公司的多人单向关系。而且,您不需要在客户机或联系的公司网络中有外键。但必须创建一个新表来中介此关系
简单的方法是为表“客户联系人”和其他“公司联系人”中的每个关系创建一个表,每个表都有to列,一个用于客户id/公司id,另一个用于联系人id。col考虑使用从客户和公司到联系人的单向映射来解决这个问题。在这种情况下,这是一个小技巧,因为如果不使用mappedBy和映射此双向关系,就无法创建
OneToMany
关系,因此联系人需要有这两列,一列为客户,另一列为公司
照顾好孩子,解决办法可能有点奇怪。这是一种来自客户和公司的多人单向关系。而且,您不需要在客户机或联系的公司网络中有外键。但必须创建一个新表来中介此关系
简单的方法是为表“客户联系人”和其他“公司联系人”中的每个关系创建一个表,每个表都有to列,一个表用于客户id/公司id,另一个表用于联系人id。col除非一个联系人可以为多个客户或多个公司工作(根据职业的不同,一个联系人经常会为多个客户工作),则联系人应提及其工作的客户和/或公司。如果客户可以为多个客户工作,则应存在一个中间实体,将每个联系人与其客户和公司联系起来。请注意,公司通常有多个联系人。通常,除非您知道关系始终为1,否则请使用n保持关系的中间连接。除非一个联系人可以为多个客户或多个公司工作(取决于职业,一个联系人通常会为多个客户工作),则联系人应提及其工作的客户和/或公司。如果客户可以为多个客户工作,则应存在一个中间实体,将每个联系人与其客户和公司联系起来。请注意,公司通常有多个联系人。通常,除非您知道关系始终为1,否则请使用n用于保持关系的中间连接。