BLOGカルテットコミュニケーションズ開発部ブログこの記事は公開されてから1年以上経過しています。情報が古い可能性がありますのでご注意ください。Embeddablesの紹介Embeddableはエンティティに別のエンティティ(ValueObject)の情報を取り込み、1つのテーブルとしてマッピングする機能です。feature.同一のプロパティ定義を何度も書く必要がないため、コード量が減らせる同一のプロパティ定義をValueObject化する事により、関心が分離できるValueObjectはデザインパターンの1つです。Evans著)などの書籍で解説されています。2.5このようなパターンに向いているエンティティの一部をValueObjectとして抽出できる複数のエンティティが共通する値を持っているエンティティの中にグループ化できるプロパティが集まっている例Embeddableの適用に最も向いていると思われるパターンの例です。Staffという3つのエンティティがあり、それぞれに居住地・DM発送先などの住所に関する値を持っているとします。$city住所をエンティティとして抽出しEmbeddableを適用すると、テーブルの構造を変更せずに一部の情報を別エンティティに分離する事ができます。MappingのOne-To-Oneを使っても似たような事が実現できます。両者の違いは、作成されるテーブル構造にあります。さきほどの例のStaff(社員情報)とAddress(住所情報)を元に違いを見てみましょう。|+--------------------+--------------+------+-----+One-To-Oneは分割したエンティティがそれぞれテーブルとして作成されるのに対し、Embeddableは1つのテーブルとして作成されます。以降は既存のエンティティから一部を分離しEmbeddablesを適用する過程を紹介します。分離対象のエンティティは、氏名や住所などを持ったStaff(社員情報)です。住所に関する部分をValueObject化まずStaffから住所に関する部分をAddressに移動します。generateコマンドで作成した場合はマッピングのアノテーションと自動生成される$idを削除してください。ValueObject化したクラスはEntityの下に配置する必要があります。埋め込み先のプロパティにEmbeddedアノテーション、ValueObject側にEmbeddableアノテーションをそれぞれ指定します。--forceを実行してみましょう。以下のようなテーブルが作成されます。|+--------------------+--------------+------+-----+columnPrefixオプションフィールド名のプレフィクスを変更する事ができます。|+---------------------------+--------------+------+-----+終わりにEmbeddablesはたくさんの便利機能を持っている訳ではありません。ValueObjectをエンティティの一部として1つのテーブルにマッピングしてくれる、ただそれだけの機能です。当社の技術ブログでは以前にDoctrine2のInheritanceMappingといった方法も紹介しています。Doctrineのいろいろな手法を知り、その場に合ったパターンをすぐに取り出せるようにしたいですね。TtskchTheme。