簡體   English   中英

如何在Doctrine中將關聯限制為另一個關聯的子集?

[英]How to restrict associations to a subset of another association in Doctrine?

在Doctrine中,我對同一個對象的多個映射有些困惑。 該應用程序基於Symfony btw構建,因此注釋略有不同。

基本上我有以下對象:

  • 組織:擁有組織屬性的保護傘
  • 部門:組織內的部門
  • 用戶:通用用戶對象

這些對象的相關關系如下:

  1. 一個組織始終只有一個所有者,即一個User
  2. 一個組織有很多成員,都是User
  3. 一個部門由許多User組成,但只允許該Department所屬Organisation的成員

我對第三個要求有些困惑……首先,這就是我的對象或多或少看起來像atm的樣子:

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

但是有沒有辦法在設計級別限制可能的對象關聯? 因此,基本上我想要的是,如果將用戶添加到部門中,則如果該用戶已經是該部門的組織的一部分,則完全有可能。 還是應該在Department對象的addMember()方法中進行檢查? 我可以想象(但找不到),存在某種子集限制( Department::members is subset of Organisation::members )。

為了盡可能低級別地執行此檢查(最接近db),我認為唯一的解決方案是Doctrine事件偵聽器 ,該偵聽器在持久事件之前檢查您的自定義約束。 閱讀更多有關教義事件系統的信息

順便說一句,我認為您可以通過一種更簡單的方式來管理這種情況:我建議您將業務邏輯封裝到服務中 (以便您可以更簡單地重用它),並在自定義驗證器中使用它,您將在其中使用該驗證器處理這種情況。

讓我知道您是否需要更多技巧來開發其中一種解決方案,或者發現更多有用的東西。

希望這個幫助

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM