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

How to map entity associations with doctrine 2 to retrieve specific data?

简介:

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

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

实际实体关联:

问题(已更新)

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

也许我必须创建一个 ProfileAccountAProfileAccountBProfileAccountC 和一个 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 方法,可用作您所处情况的指南。