はじめ:特定のデータを取得するためにエンティティの関連付けをdoctrine 2とどのようにマップするのですか?
私はより具体的なものを作ることができなかったので、質問のタイトルは少し汎用的ですが、今私は私の問題のより良い説明を与えることをしようとします。 Symfony(> = 3. *)とDoctrine ORM(> = 2.5)の私の最初の大きなプロジェクトです。モデリングエンティティの関連付けについての私の理解を向上させるために、何を覚えておくべきかについてのヒントを得ることを望みます。
最小化されたユースケース(PS:CodeStyled
言葉はDoctrineのエンティティです):
- 私は4つのアカウントの種類を定義している
AccountType
実体を持っています。 User
は自分の資格情報を登録でき、AccountType
を1つ選択する必要があります。- 私は相対エンティティ
ProfileOne
,ProfileTwo
,ProfileThree
,ProfileFour
,ProfileFive
の5つのプロファイルタイプを持っています。 User
とAccountType:A
は、1つだけを作成できます。ProfileOne
と1つだけ、ProfileTwo
。User
とAccountType:B
は、無制限のProfileOne
とProfileTwo
を作成できます。User
とAccountType:C
は、無制限のProfileFour
を作成できます。User
とAccountType:D
は、1つだけを作成できます。ProfileFive
。実際のエンティティの関連付け
:
User
はAccountType
との一方向のOneToOne
を持っています。
質問(更新):
私は外のロジックを管理するように強制しています(ES:リポジトリ内)またはAccountType
に基づいて適切なデータを取得するためにエンティティをマッピングする方法を存在(ユースケースに示されているように)?
たぶん私はどこその後、機能getProfile()
の内側に、私は戻っにロジックを管理する$profile = $user->getProfile()
のようなものを持っていることができるようにAccountType
に基づいて相対的な関連付けを格納するには、ProfileAccountA
、ProfileAccountB
、ProfileAccountC
とProfileAccountD
を作成するためにきました適切なデータ(Factoryクラスのようなもの)? 「はい」の場合、これは一般的かつ有効なアプローチですか、あるいはこのユースケースにはより良い選択肢がありますか?
答えと遅れて申し訳ありませんのおかげで、私は旅行中でした。あなたが私の質問で見たように、あなたが説明したことも私の最初の考えでした。 'getProfile()'メソッドについては一例に過ぎず、このケースでは 'getData()'の名前を付けたほうがいいかもしれません(ある種のアカウントタイプは1つ以上のコレクションに関連付けられています。このアプローチを使うと、 'ProfileAccount *'クラスを 'AccountType'や他の場所に関連付けるべきだと思いますか? – RocketOne
@RocketOneこのアプローチを使用すると、 'AccountType'クラスはありません。 'ProfileAccount *'は 'User'に関連付けられますが、' ProfileAccount * 'の代わりに 'Account *'という名前を付ける方が良いでしょう。だから、 'User'は' Profile * 'を持つ' Account * 'を持っています。 'getData()'は、あまりにも一般的で意味がないので、通常は関数の悪い名前です。あなたの 'Account * 'のいくつかが単一の' Profile *'に関連付けられていても、インタフェースに準拠するようにコレクションを返す必要があります。PHP7.0 +を使用する場合は、戻り値の型( 'Collection'または' array')を追加してください。 –
こんにちはRenan、私はあなたのポイントを持っていますが、 'AccountType'エンティティは' User'に属していない他の関連とプロパティも含んでいるので必須です(私の例は現実を最小限に抑えています)。この要件を考慮して、より詳細な例であなたの答えを更新できますか? – RocketOne