Я немного застрял с несколькими отображениями одного и того же объекта в Доктрине. Приложение построено на Symfony btw, отсюда несколько разные аннотации.Как ограничить ассоциации подмножеством другой ассоциации в Доктрине?
В основном я следующие объекты:
- Организация: зонтичной холдинг атрибуты об организации
- отдела: отдел в рамках организации
- Пользователя: общий объект пользователя
Эти объекты связаны следующим образом:
- Организация всегда имеет один и только один владелец, который является
User
- Организация имеет много членов, которые все
User
's - Отдел состоит из многих
User
-х, но только членыOrganisation
вDepartment
является частью допускаются
я немного застрял на третьем требовании ... Прежде всего, это то, как мои объекты более или менее похожим атм:
/**
* @ORM\Entity
* @ORM\Table(name="organisations")
*/
class Organisation
{
// ...
/**
* @ORM\OneToOne(targetEntity="User", inversedBy="organisation")
*/
private $owner;
/**
* ORM\OneToMany(targetEntity="User", mappedBy="organisation")
*/
private $members
}
/**
* @ORM\Entity
* @ORM\Table(name="departments")
*/
class Department
{
// ...
/**
* @ORM\ManyToMany(targetEntity="User", mappedBy="departments")
*/
private $members
/**
* @ORM\ManyToOne(targetEntity="Organisation", inversedBy="departments")
*/
private $organisation;
}
/**
* @ORM\Entity
* @ORM\Table(name="users")
*/
class User
{
// ...
/**
* The organisation this user "owns"
*
* @ORM\OneToOne(targetEntity="Organisation", mappedBy="owner", nullable=true)
*/
private $owning_organisation;
/**
* @ORM\ManyToOne(targetEntity="Organisation", inversedBy="members")
*/
private $organisations;
/**
* @ORM\ManyToMany(targetEntity="Department", inversedBy="members")
* @ORM\JoinTable(name="users_departments")
*/
private $departments;
}
Теперь это в основном работает, если и только в контроллерах я делаю все проверки (что-то вроде (if($user->isPartOfOrganisation($department-getOrganisation()) { $department->addMember($user); }
).
Но есть ли способ ограничить возможные ассоциации объектов на уровне проектирования? Поэтому в основном я хочу, чтобы, если пользователь добавлен в отдел, это возможно только в том случае, если пользователь уже является частью организации, частью которой является отдел. Или я должен сделать проверку в методе addMember()
объекта Department
? Я могу представить (но не могу найти), что существует какое-то ограничение подмножества (Department::members is subset of Organisation::members
).
Да, я думаю, что это путь;) Спасибо за указание мне в правильном направлении! Я попробую это и позже отправлю решение! – giorgio