php - 如何将关联限制为 Doctrine 中另一个关联的子集?

标签 php symfony doctrine-orm

我在 Doctrine 中对同一对象的多个映射感到有点困惑。顺便说一句,该应用程序是在 Symfony 上构建的,因此注释略有不同。

基本上我有以下对象:

  • 组织:保存组织属性的保护伞
  • 部门:组织内的部门
  • 用户:通用用户对象

这些对象的相关性如下:

  1. 一个组织始终只有一个所有者,即用户
  2. 一个组织有许多成员,这些成员都是用户
  3. 一个部门由许多用户组成,但仅允许部门所属的组织成员使用
  4. >

我对第三个要求有点困惑......首先,这就是我的对象或多或少看起来像自动取款机的方式:

/**
 * @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;
}

现在这基本上有效,当且仅在 Controller 中我进行所有检查(类似于 (if( $user->isPartOfOrganization($department-getOrganization()) { $department->addMember($用户);})。

但是有没有办法在设计层面限制可能的对象关联呢?所以基本上我想要的是,如果将用户添加到部门,则只有当该用户已经是该部门所属组织的一部分时才有可能。或者我应该在 Department 对象的 addMember() 方法中进行检查?我可以想象(但找不到)存在某种子集限制(Department::members 是 Organization::members 的子集)。

最佳答案

为了尽可能低级别地实现此检查(最接近数据库),我认为唯一的解决方案是 Doctrine Event Listener在预持久事件中检查您的自定义约束。了解更多关于 Doctrine Event System .

顺便说一句,我认为您可以以更简单的方式管理这种情况:我建议您将业务逻辑封装到服务中(这样您就可以更简单地重用它)并在< strong>自定义验证器,您将在管理这种情况的表单中使用它。

如果您需要更多提示来开发此解决方案之一,或者您发现了更有用的东西,请告诉我。

希望这有帮助

关于php - 如何将关联限制为 Doctrine 中另一个关联的子集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28543377/

相关文章:

php - 在 PHP 的扩展类中使用静态函数

php - 如何仅在 Doctrine 中按日期部分分组

php - Symfony 2 Doctrine 计数

doctrine-orm - 使用 Doctrine 在 Symfony3 中实现好友关系

symfony - 原则 - 一次插入多个文档时,不会激发所有文档的 postUpdate 事件订阅者

php - 交响乐 : Detached entity cannot be removed in test suite w/phpunit

php - 尝试在两个不同数据库中的两个表之间找到至少一个相似性

php - 在 PHP 中更改 MySQL 中的记录顺序

php - Symfony 表单 - 密码类型

php - 导入 utf-8 标题 Maatwebsite Laravel