如何将实体关联映射到学说 2 以检索特定数据?
How to map entity associations with doctrine 2 to retrieve specific data?
简介:
问题的标题有点笼统,因为我无法做出更具体的问题,但现在我会尝试更好地描述我的问题。
这是我使用 Symfony (>=3.*) 和 Doctrine ORM (>=2.5) 的第一个大项目,我希望得到一些 tips 关于要记住的内容以提高我对建模实体关联的理解。
最小化用例(ps:CodeStyled
单词是 Doctrine 实体):
- 我有
AccountType
实体,其中定义了 4 种帐户类型。
- A
User
可以注册他的凭据并且必须选择一个 AccountType
。
- 我在相关实体中有 5 个配置文件类型
ProfileOne
、ProfileTwo
、ProfileThree
、ProfileFour
、ProfileFive
。
User
和AccountType:A
只能创建1个ProfileOne
,只能创建1个ProfileTwo
。
User
和AccountType:B
可以无限创建ProfileOne
和ProfileTwo
。
User
和AccountType:C
可以无限创建ProfileFour
。
User
和AccountType:D
只能创建1个ProfileFive
。
实际实体关联:
User
有单向 OneToOne
和 AccountType
.
问题(已更新):
我被迫在外部(例如:在存储库中)管理逻辑,或者存在一种方法来映射实体以根据 AccountType
(如 [=86= 中所示)检索正确的数据])?
也许我必须创建一个 ProfileAccountA
、ProfileAccountB
、ProfileAccountC
和一个 ProfileAccountD
,在哪里存储基于 [=11= 的相关关联] 然后能够有类似 $profile = $user->getProfile()
的东西,在函数内部 getProfile()
我管理逻辑以 returns 正确的数据(就像在工厂 class 中)?如果是,这是一种常见且有效的方法还是有更好的替代方法 use-case?
为每个帐户类型(例如:AccountTypeA、AccountTypeB 等)创建一个 class。属性、关联和规则告诉 User
可以拥有哪些和多少配置文件应该封装在那些 classes 中。
您的关联将如下所示:User
有一个 (oneToOne) Account
有一个或多个 (oneToMany) Profile
你可能想要 AccountInterface
:
interface AccountInterface
{
public function getProfiles(): Collection;
}
一个帐户示例 class。最好根据它们的性质来命名它们(FreeAccount、MasterAccount...):
class MasterAccount implements AccountInterface
{
private $masterProfile;
private $expirationDate;
private $anotherAccountRelatedProperty;
public function getProfiles(): Collection
{
return new ArrayCollection([$this->masterProfile]);
}
}
与该帐户相关的任何 属性、关联或行为都应包含在这些 class 中。
为了获得 User
配置文件,它应该委托给帐户:
//User class
private $account;
public function getProfiles(): Collection
{
return $this->account->getProfiles();
}
这是一种不错的 OOP 方法,可用作您所处情况的指南。
简介:
问题的标题有点笼统,因为我无法做出更具体的问题,但现在我会尝试更好地描述我的问题。 这是我使用 Symfony (>=3.*) 和 Doctrine ORM (>=2.5) 的第一个大项目,我希望得到一些 tips 关于要记住的内容以提高我对建模实体关联的理解。
最小化用例(ps:CodeStyled
单词是 Doctrine 实体):
- 我有
AccountType
实体,其中定义了 4 种帐户类型。 - A
User
可以注册他的凭据并且必须选择一个AccountType
。 - 我在相关实体中有 5 个配置文件类型
ProfileOne
、ProfileTwo
、ProfileThree
、ProfileFour
、ProfileFive
。 User
和AccountType:A
只能创建1个ProfileOne
,只能创建1个ProfileTwo
。User
和AccountType:B
可以无限创建ProfileOne
和ProfileTwo
。User
和AccountType:C
可以无限创建ProfileFour
。User
和AccountType:D
只能创建1个ProfileFive
。
实际实体关联:
User
有单向OneToOne
和AccountType
.
问题(已更新):
我被迫在外部(例如:在存储库中)管理逻辑,或者存在一种方法来映射实体以根据 AccountType
(如 [=86= 中所示)检索正确的数据])?
也许我必须创建一个 ProfileAccountA
、ProfileAccountB
、ProfileAccountC
和一个 ProfileAccountD
,在哪里存储基于 [=11= 的相关关联] 然后能够有类似 $profile = $user->getProfile()
的东西,在函数内部 getProfile()
我管理逻辑以 returns 正确的数据(就像在工厂 class 中)?如果是,这是一种常见且有效的方法还是有更好的替代方法 use-case?
为每个帐户类型(例如:AccountTypeA、AccountTypeB 等)创建一个 class。属性、关联和规则告诉 User
可以拥有哪些和多少配置文件应该封装在那些 classes 中。
您的关联将如下所示:User
有一个 (oneToOne) Account
有一个或多个 (oneToMany) Profile
你可能想要 AccountInterface
:
interface AccountInterface
{
public function getProfiles(): Collection;
}
一个帐户示例 class。最好根据它们的性质来命名它们(FreeAccount、MasterAccount...):
class MasterAccount implements AccountInterface
{
private $masterProfile;
private $expirationDate;
private $anotherAccountRelatedProperty;
public function getProfiles(): Collection
{
return new ArrayCollection([$this->masterProfile]);
}
}
与该帐户相关的任何 属性、关联或行为都应包含在这些 class 中。
为了获得 User
配置文件,它应该委托给帐户:
//User class
private $account;
public function getProfiles(): Collection
{
return $this->account->getProfiles();
}
这是一种不错的 OOP 方法,可用作您所处情况的指南。