简介:
问题的标题有点泛,因为我无法做出更具体的问题,但现在我会尝试更好地描述我的问题。 这是我与Symfony(> = 3. *)和Doctrine ORM(> = 2.5)的第一个大项目,我希望得到一些提示,以便提高我对建模实体关联的理解。
最小化用例(ps:CodeStyled
字是Doctrine实体):
AccountType
实体,其中定义了4种帐户类型。User
可以注册其凭据,必须选择一个AccountType
。ProfileOne
,ProfileTwo
,ProfileThree
,ProfileFour
,ProfileFive
中有5种配置文件类型。User
AccountType:A
ProfileOne
只能创建1个ProfileTwo
,只能创建User
。AccountType:B
ProfileOne
ProfileTwo
可以创建无限User
和AccountType:C
。ProfileFour
与User
可以创建无限AccountType:D
。ProfileFive
User
只能创建1个OneToOne
。实际实体关联:
AccountType
具有AccountType
ProfileAccountA
的单向{。}}。问题(更新):
我被迫管理外部逻辑(例如:在存储库中)或存在一种映射实体的方法,以便根据ProfileAccountB
检索正确的数据(如用例中所示) ?
也许我已经创建了ProfileAccountC
,ProfileAccountD
,AccountType
和$profile = $user->getProfile()
,根据{{1}来存储相关关联然后能够在函数getProfile()
内部有->
这样的东西我管理逻辑以返回正确的数据(比如在Factory类中)?如果是,这是一种常见且有效的方法,还是有更好的替代方案用于此用例?
答案 0 :(得分:0)
为每种帐户类型创建一个类(例如:AccountTypeA,AccountTypeB等)。应该将User
可以包含哪些和多少个配置文件的属性,关联和规则封装在这些类中。
您的关联将如下所示: User
有一个(oneToOne)Account
,其中包含一个或多个(oneToMany)Profile
您可能需要AccountInterface
:
interface AccountInterface
{
public function getProfiles(): Collection;
}
Account类的示例。根据他们的性质(FreeAccount,MasterAccount ......)更好地命名它们:
class MasterAccount implements AccountInterface
{
private $masterProfile;
private $expirationDate;
private $anotherAccountRelatedProperty;
public function getProfiles(): Collection
{
return new ArrayCollection([$this->masterProfile]);
}
}
与帐户相关的任何属性,关联或行为都应该存在于这些类中。
为了获取User
个人资料,它应该委托给该帐户:
//User class
private $account;
public function getProfiles(): Collection
{
return $this->account->getProfiles();
}
这是一种体面的OOP方法,可以作为您情况的指导。