2017-03-19 2 views
1

はじめ特定のデータを取得するためにエンティティの関連付けをdoctrine 2とどのようにマップするのですか?

私はより具体的なものを作ることができなかったので、質問のタイトルは少し汎用的ですが、今私は私の問題のより良い説明を与えることをしようとします。 Symfony(> = 3. *)とDoctrine ORM(> = 2.5)の私の最初の大きなプロジェクトです。モデリングエンティティの関連付けについての私の理解を向上させるために、何を覚えておくべきかについてのヒントを得ることを望みます。

最小化されたユースケース(PS:CodeStyled言葉はDoctrineのエンティティです):

  • 私は4つのアカウントの種類を定義しているAccountType実体を持っています。
  • Userは自分の資格情報を登録でき、AccountTypeを1つ選択する必要があります。
  • 私は相対エンティティProfileOne,ProfileTwo,ProfileThree,ProfileFour,ProfileFiveの5つのプロファイルタイプを持っています。
  • UserAccountType:Aは、1つだけを作成できます。ProfileOneと1つだけ、ProfileTwo
  • UserAccountType:Bは、無制限のProfileOneProfileTwoを作成できます。
  • UserAccountType:Cは、無制限のProfileFourを作成できます。
  • UserAccountType:Dは、1つだけを作成できます。ProfileFive。実際のエンティティの関連付け

  • UserAccountTypeとの一方向のOneToOneを持っています。

質問(更新)

私は外のロジックを管理するように強制しています(ES:リポジトリ内)またはAccountTypeに基づいて適切なデータを取得するためにエンティティをマッピングする方法を存在(ユースケースに示されているように)?

たぶん私はどこその後、機能getProfile()の内側に、私は戻っにロジックを管理する$profile = $user->getProfile()のようなものを持っていることができるようにAccountTypeに基づいて相対的な関連付けを格納するには、ProfileAccountAProfileAccountBProfileAccountCProfileAccountDを作成するためにきました適切なデータ(Factoryクラスのようなもの)? 「はい」の場合、これは一般的かつ有効なアプローチですか、あるいはこのユースケースにはより良い選択肢がありますか?

答えて

0

アカウントの種類ごとにクラスを作成します(例:AccountTypeA、AccountTypeBなど)。 Userにどれくらいの数のプロファイルを持つことができるかを示すプロパティ、アソシエーション、およびルールをこれらのクラスにカプセル化する必要があります。このようになります。

あなたの団体:Userは、一つ以上の(oneToMany)を持っている(oneToOne)AccountProfile

あなたはおそらくたくなるあり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のアプローチです。

+0

答えと遅れて申し訳ありませんのおかげで、私は旅行中でした。あなたが私の質問で見たように、あなたが説明したことも私の最初の考えでした。 'getProfile()'メソッドについては一例に過ぎず、このケースでは 'getData()'の名前を付けたほうがいいかもしれません(ある種のアカウントタイプは1つ以上のコレクションに関連付けられています。このアプローチを使うと、 'ProfileAccount *'クラスを 'AccountType'や他の場所に関連付けるべきだと思いますか? – RocketOne

+0

@RocketOneこのアプローチを使用すると、 'AccountType'クラスはありません。 'ProfileAccount *'は 'User'に関連付けられますが、' ProfileAccount * 'の代わりに 'Account *'という名前を付ける方が良いでしょう。だから、 'User'は' Profile * 'を持つ' Account * 'を持っています。 'getData()'は、あまりにも一般的で意味がないので、通常は関数の悪い名前です。あなたの 'Account * 'のいくつかが単一の' Profile *'に関連付けられていても、インタフェースに準拠するようにコレクションを返す必要があります。PHP7.0 +を使用する場合は、戻り値の型( 'Collection'または' array')を追加してください。 –

+0

こんにちはRenan、私はあなたのポイントを持っていますが、 'AccountType'エンティティは' User'に属していない他の関連とプロパティも含んでいるので必須です(私の例は現実を最小限に抑えています)。この要件を考慮して、より詳細な例であなたの答えを更新できますか? – RocketOne

関連する問題