作者:乔9000 | 来源:互联网 | 2022-11-30 02:11
我正在创建一个网站,该网站应至少具有两种类型的用户,公司和客户,其中两种用户具有相同的登录表单和不同的注册表单,并且它们可以彼此发送消息...
正常情况下(不用考虑教义)我认为数据库应该看起来像这样:
用户(标识,电子邮件,密码,facebook_id,角色)
公司(标识,user_id,名称,城市,...)
客户(id,user_id,名称) ,sex ...)
消息(id,sender_id(用户ID),receiver_id(用户ID),消息...)
...
因此,现在我想知道使用Doctrine和Symfony 4实施此要求的最佳和最简单的方法,实体的外观如何?
(注意:我没有使用FOSUserBundle)
1> Pmpr..:
实现此域:
用户
公司
客户
您可以考虑两种不同的方法:
第一种方法
这种方法使用关联。如果选择此选项,则应根据某些逻辑手动将适当的(公司或客户)链接到当前用户。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所说的那样:
映射超类定义的持久关系必须是单向的(仅具有拥有方)。这意味着在映射的超类上根本不可能存在一对多关联。