1

Doctrine 2 で自分のエンティティを定義する最善の方法を見つけようとしていますが、本当に正しいと感じられる解決策はありません。私はこれを間違った角度から行っている可能性があるため、ポインタは非常に高く評価されています。

問題は、ユーザーと 1 つ以上のプロファイルのエンティティを定義することです。現在、私は現在のセットアップを持っています:

ユーザー

/**
 * @ORM\Entity
 */
class User {
    use AutoIdentifiable; //Trait for auto-generating an @id.

    /**
     * @ORM\OneToMany(targetEntity="UserProfile", mappedBy="user", cascade={"all"}, fetch="EAGER", orphanRemoval=TRUE)
     * @var UserProfile
     */
    protected $profiles;    
}

ユーザープロフィール

/**
 * @ORM\Entity
 * @ORM\InheritanceType("JOINED")
 * @ORM\DiscriminatorColumn(name="discr", type="string")
 * @ORM\DiscriminatorMap({"personalprofile" = "PersonalProfile", "companyprofile" = "CompanyProfile"})
 */
abstract class UserProfile {
    use AutoIdentifiable;

    /**
     * @ORM\ManyToOne(targetEntity="User", inversedBy="profiles", fetch="EAGER")
     * @var User
     */
    protected $user;
}

個人プロフィール

/**
 * @ORM\Entity
 */
class PersonalProfile extends UserProfile {
    /**
     * @ORM\Column(length=50)
     * @var String
     */
    protected $firstName;

    /**
     * @ORM\Column(length=50)
     * @var String
     */
    protected $lastName;
}

会社概要

/**
 * @ORM\Entity
 */
class CompanyProfile extends UserProfile {

    /**
     * @ORM\Column
     * @var String
     */
    protected $name;

    /**
     * @ORM\Column(length=9)
     * @var String
     */
    protected $orgNr;
}

ご覧のとおり、1 人のユーザーが、まったく異なる情報を含む 1 つ以上のプロファイルを持つことができます。このデザインを使い続けることにした場合は、ユーザーが持つ役割に応じて、後でさらにプロファイルを追加することになるでしょう。(たとえば、ユーザーが個人的なブログを持っている場合、写真と自分自身の説明を含む BlogProfile を持っている可能性があります。)

問題は、特定のプロファイルを読み込んで確認するのが非常に扱いにくく、ユーザーがプロファイルの組み合わせを持っている可能性があることです。(例: 個人 + ブログ) 特定のプロファイルごとに名前付きの参照を作成することも、良い考えではないようです。Decorator パターンを確認しましたが、それが適切かどうかはわかりません。

質問は次のとおりです。

  1. このタイプの構造に最適な、私が見逃しているデザインパターンはありますか?
  2. 問題全体に対処するためのさらに良い方法があるのではないでしょうか?
  3. これらのタイプのデータ構造の経験があり、役立つヒントを共有できる人はいますか?
4

1 に答える 1