5

私は次のデータベースの状況を持っている:ドクトリン2.1 - 複数のテーブルにマップするエンティティ

wp_users (user table generated by wordpress) 
ID | user_login | ... 

wp_sp_user (extension to the wp_users table) 
ID (FK) | surname | address | ... 

は今、私はすでに1つのUserの実体、例えばに「ヒューズ」に時間これらの2つのテーブルをしようとしてきました

class User { 
    var ID; 
    var user_login; 
    var surname; 
    var address; 
    ... 
} 

wp_userテーブルを変更せずにこのようなマッピングを行う方法はありますか(理由はわかりません)。

+0

http://stackoverflow.com/questions/18213381 –

答えて

15

データベースのリファクタリングが不可能な場合や、テーブルに独自の「存在理由」がある場合があります。この場合、継承を使用することができます。あなたのUserクラスはAccountを拡張することができます。アカウントをwp_usersにマップし、wp_sp_userテーブルでそれを拡張します。ユーザークラスは2つのテーブルの列を使用します。

http://docs.doctrine-project.org/en/latest/reference/inheritance-mapping.html#class-table-inheritance

+2

@MrMuhこれは正解であり、受け入れられた答えは間違っています/時代遅れです。これを承認された答えにすることを検討してください。 –

-5

これはできません。そうすることも理にかなっていません。

MySQLでテーブルを物理的にマージし、そのテーブルのDoctrineエンティティを作成する必要があります。これは、データがクリーンで完全に正規化されていることを保証する唯一の方法です。

もう1つの考えられる解決策は、テーブルごとに1つのエンティティを作成し、ビジネスオブジェクトを使用してそれぞれの結果を結合することです。アプリケーション層の制約を処理しなければならないので、これはまったく良い解決策ではありません。また、起動するクエリの数も2倍になります。

+1

1を関連している:ここでは

は、教義のドキュメントです。また、いくつかのデータベーステーブルのデータをカプセル化するクラスを持つことはお勧めできません。テーブルを1つにマージしたり、2つのクラスを設計したりする方が良いでしょう。あなたの現在のアプローチでは、それは何らかの[ダイバージェント変更](http://sourcemaking.com/refactoring/divergent-change)です。だから、遅かれ早かれリファクタリングする必要があります。 – J0HN

+3

-1実際には、コンテキストに基づいてデータを分離することができる3番目の正規形です。あなたは2テーブルのユーザーとユーザーの詳細を持つことができます。しかし、それに応じて3番目の通常のフォームのユーザーの詳細は、住所の詳細(通り、都市、国)、個人の詳細(性別、身長、年齢、所得、no_children)、contact_details(phone_no、PoBox)などに分割する必要があります。 Doctrineは依然として弱いORMであり、他の成熟言語で実装されているものには程遠いです。今の例でさえ、DDD値オブジェクト(またはVOのコレクション)の完全なsuportを持っていません。あなたの答えは「11」でした。 – Tudor

+1

「これはできません。また、それは意味をなさない」これは間違っています。 (おそらく、教義1では本当ですか?)@ tlmak0の答えのリンクは、それが可能であることを明確に示しています。そして、OPは論理的に異なる情報セットを格納するので、2つのテーブルを別々に保つことが理にかなっていると思うシナリオをレイアウトしました(おそらく、異なるWPアカウントにユーザーを割り当てる場合がありますか? )、WordPressのDB構造を保存するためにそれらをマージしないことが賢明でしょう。 –

関連する問題