0

私は持っていclass Employee extends Personます。時間が経つにつれて、既存のものは会社のものにPersonなる可能性があります。Employee

生の SQL を使用して識別子の型を変更するか、あいまいな PECL 拡張機能を使用して型キャストするのは悪い習慣であることはわかっています。

しかし、この種の複雑さを管理する設計パターンはありますか?

これを達成するために、すべての属性と関係を複製する唯一の方法はありますか (人は他のエンティティと多くの関係を持っています)? 既存の人物とそのすべての関係を複製するにはどうすればよいですか?

4

2 に答える 2

3

Personとは 2 つの異なる「もの」であるためEmployee、Person エンティティと 1 対 1 の関係を持つ Employee エンティティを作成する必要があります。これは、Employee が常に Person であることを意味しますが、Person は必ずしも Employee であるとは限りません。

class Employee
{
    /**
     * @ORM\OneToOne(targetEntity="Acme\PersonBundle\Entity\Person", cascade={"persist"})
     * @ORM\JoinColumn(referencedColumnName="id", nullable=true)
     */
    protected $person;
}

これにより、既存のすべてのプロパティを備えた Person エンティティを保持できるため、データを複製する必要がなくなります (これは決して良い考えではありません)。最も重要なことは、2 つのオブジェクト タイプを分離することです。

@Zeljko が述べたように、タイプ フィールド フィールドを作成することもできますが、データを正規化する私のアプローチははるかにクリーンであると思います。複数のタイプの従業員が必要な場合は、EmployeeType テーブルを作成し、Employee エンティティに EmployeeType_ID を含めることができます。この方法は、乱雑になりがちで保守が困難になりがちな定数を使用するよりもはるかにクリーンです。

于 2013-06-06T13:45:19.580 に答える
1

データの複製は悪い考えです。覚えておいてください:あなたが何かを複製しているなら、あなたはそれを間違っています:)

最善の解決策は、継承をまったく使用しないことだと思います。たとえば、 Person エンティティに新しい列を作成するだけです。typeこれは定数になります。そのエンティティに、次のようなものを入れます。

class Person
{
    const TYPE_USER = 0 ;
    const TYPE_EMPLOYEE = 1 ;
    const TYPE_BIG_FAT_BOSS = 2 ;
    ...

    /**
    * @ORM\Column(type="integer")
    */
    protected $type = self::TYPE_USER ;

typeこのようにして、列を更新するだけで機能が向上します。

于 2013-06-06T13:19:43.480 に答える