如何将实体关联映射到doctrine 2以检索特定数据?

时间:2017-03-19 01:19:06

标签: symfony doctrine-orm associations model-associations

简介

问题的标题有点泛,因为我无法做出更具体的问题,但现在我会尝试更好地描述我的问题。 这是我与Symfony(> = 3. *)和Doctrine ORM(> = 2.5)的第一个大项目,我希望得到一些提示,以便提高我对建模实体关联的理解。

最小化用例(ps:CodeStyled字是Doctrine实体):

  • 我有AccountType实体,其中定义了4种帐户类型。
  • User可以注册其凭据,必须选择一个AccountType
  • 我在相对实体ProfileOneProfileTwoProfileThreeProfileFourProfileFive中有5种配置文件类型。
  • User AccountType:A ProfileOne只能创建1个ProfileTwo,只能创建User
  • AccountType:B ProfileOne ProfileTwo可以创建无限UserAccountType:C
  • ProfileFourUser可以创建无限AccountType:D
  • ProfileFive User只能创建1个OneToOne

实际实体关联

  • AccountType具有AccountType ProfileAccountA的单向{。}}。

问题(更新)

我被迫管理外部逻辑(例如:在存储库中)或存在一种映射实体的方法,以便根据ProfileAccountB检索正确的数据(如用例中所示) ?

也许我已经创建了ProfileAccountCProfileAccountDAccountType$profile = $user->getProfile(),根据{{1}来存储相关关联然后能够在函数getProfile()内部有->这样的东西我管理逻辑以返回正确的数据(比如在Factory类中)?如果是,这是一种常见且有效的方法,还是有更好的替代方案用于此用例?

1 个答案:

答案 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方法,可以作为您情况的指导。