[英]How to restrict associations to a subset of another association in Doctrine?
在Doctrine中,我對同一個對象的多個映射有些困惑。 該應用程序基於Symfony btw構建,因此注釋略有不同。
基本上我有以下對象:
這些對象的相關關系如下:
User
User
的 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.