Symfony / Doctrine - Типы для нескольких пользователей - PullRequest
0 голосов
/ 13 ноября 2018

Я создаю веб-сайт, на котором должно быть как минимум два типа пользователей, Компания и Клиент, два из них имеют одинаковую форму входа и разные регистрационные формы, и они могут отправлять сообщения друг другу ...

Normaly (не думая о доктрине) Я думаю, что база данных должна выглядеть примерно так:
Пользователь (идентификатор, адрес электронной почты, пароль, facebook_id, роли)
Компания (идентификатор, идентификатор пользователя, имя, город, ...)
Клиент (идентификатор, идентификатор пользователя, имя, пол ...)
Сообщения (id, идентификатор отправителя (user_id), идентификатор получателя (user_id), сообщение, ...)
...

Итак, теперь я хочу узнать, как лучше и проще реализовать эти требования, используя Doctrine и Symfony 4 , Как могут выглядеть сущности?

(Примечание: я не использую FOSUserBundle )

1 Ответ

0 голосов
/ 14 ноября 2018

Реализация этого домена:

  • Пользователь
  • Компания
  • Клиент

Вы можете рассмотреть два разных подхода:

Первый подход

Этот подход использует ассоциацию. Если вы выберете этот вариант, вы должны вручную связать соответствующий (компания или клиент) с текущим пользователем в зависимости от некоторой логики. Каждое 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 говорит :

постоянные отношения, определенные сопоставленным суперклассом, должны быть однонаправленными (только со стороной-владельцем). Это означает, что связи один-ко-многим вообще не возможны для сопоставленного суперкласса.

...