我正在创建一个网站,该网站应至少具有两种类型的用户,公司和客户,其中两种用户具有相同的登录表单和不同的注册表单,并且它们可以彼此发送消息...
通常(不用考虑教义),我认为数据库应该看起来像这样:
用户(ID,电子邮件,密码,facebook_id,角色)
公司(ID,用户ID,名称,城市,...)
客户(id,user_id,姓名,性别...)
消息(ID,发送方ID(用户ID),接收方ID(用户ID),消息等)
...
所以现在我想知道使用 Doctrine 和 Symfony 4 来实现此要求的最佳和最简单的方法,实体看起来如何?
(注意:我没有使用 FOSUserBundle )
答案 0 :(得分:3)
实施此域:
您可以考虑两种不同的方法:
此方法使用关联。如果选择此选项,则应根据某些逻辑手动将适当的(公司或客户)链接到当前用户。在任何给定的时间点,每个User
都应该只有一个字段。公司或客户,而不是两者。
用户
/** @Entity */
class User
{
/**
* @ORM\column(type="string")
*/
protected password;
/**
* @ORM\column(type="array")
*/
protected roles;
/**
* @ORM\OneToOne(targetEntity="Company", mappedBy="user")
*/
protected Company;
/**
* @ORM\OneToOne(targetEntity="Client", mappedBy="user")
*/
protected Client;
}
公司
/** @Entity */
class Company
{
/**
* @ORM\column(type="string")
*/
protected city;
/**
* @ORM\OneToOne(targetEntity="User", inversedBy="company")
*/
protected user;
}
客户
/** @Entity */
class Client
{
/**
* @ORM\column(type="string")
*/
protected sex;
/**
* @ORM\OneToOne(targetEntity="User", inversedBy="client")
*/
protected user;
}
此方法使用继承,并且似乎更灵活,但也有其缺点。
用户
/** @MappedSuperclass */
class User
{
/**
* @ORM\column(type="string")
*/
protected password;
/**
* @ORM\column(type="array")
*/
protected roles;
}
公司
/** @Entity */
class Company extends User
{
/**
* @Id @Column(type="integer")
*/
protected $id;
/**
* @ORM\column(type="string")
*/
protected city;
}
客户
/** @Entity */
class Client extends User
{
/**
* @Id @Column(type="integer")
*/
protected $id;
/**
* @ORM\column(type="string")
*/
protected sex;
}
在用户和消息之间,您还具有一对多关系:
使用上面的第一种方法很好,但是使用第二种方法,您会遇到Doctrine says的麻烦:
映射超类定义的持久关系必须是单向(仅具有拥有方)。这意味着在映射的超类上根本不可能一对多关联。