Symfony /主义-多种用户类型

时间:2018-11-13 17:39:02

标签: symfony doctrine

我正在创建一个网站,该网站应至少具有两种类型的用户,公司和客户,其中两种用户具有相同的登录表单和不同的注册表单,并且它们可以彼此发送消息...

通常(不用考虑教义),我认为数据库应该看起来像这样:
用户(ID,电子邮件,密码,facebook_id,角色)
公司(ID,用户ID,名称,城市,...)
客户(id,user_id,姓名,性别...)
消息(ID,发送方ID(用户ID),接收方ID(用户ID),消息等)
...

所以现在我想知道使用 Doctrine Symfony 4 来实现此要求的最佳和最简单的方法,实体看起来如何?

(注意:我没有使用 FOSUserBundle

1 个答案:

答案 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的麻烦:

  映射超类定义的

持久关系必须是单向(仅具有拥有方)。这意味着在映射的超类上根本不可能一对多关联。