2015-02-16 3 views
3

Я немного застрял с несколькими отображениями одного и того же объекта в Доктрине. Приложение построено на Symfony btw, отсюда несколько разные аннотации.Как ограничить ассоциации подмножеством другой ассоциации в Доктрине?

В основном я следующие объекты:

  • Организация: зонтичной холдинг атрибуты об организации
  • отдела: отдел в рамках организации
  • Пользователя: общий объект пользователя

Эти объекты связаны следующим образом:

  1. Организация всегда имеет один и только один владелец, который является User
  2. Организация имеет много членов, которые все User 's
  3. Отдел состоит из многих 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).

ответ

3

Чтобы реализовать эту проверку как можно ниже (ближайший к db), я думаю, что единственным решением является Doctrine Event Listener, что в проверке события перед сохранением для вашего пользовательского ограничения. Узнайте больше о Doctrine Event System.

BTW Я думаю, что вы можете справиться с этой ситуацией более просто образом: я предлагаю вам инкапсулировать в бизнес-логику в сервис (так что вы можете использовать его более просто) и использовать его в валидатора что вы будете использовать в том виде, в котором вы управляете этой ситуацией.

Сообщите мне, если вам нужно больше советов по разработке одного из этих решений или если вы нашли что-то более полезное.

Надеется, что это поможет

+1

Да, я думаю, что это путь;) Спасибо за указание мне в правильном направлении! Я попробую это и позже отправлю решение! – giorgio