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