主义多重鉴别器继承

时间:2017-01-26 19:21:18

标签: php symfony inheritance doctrine mapping

我目前正在一个简单的Symfony框架中实现一个用户系统。我正在使用包含基本用户实体的供应商包:

/**
 * @ORM\Entity()
 * @ORM\InheritanceType("JOINED")
 * @ORM\DiscriminatorColumn(name="discr", type="string")
 */
class User
{
    protected $id;
    protected $username;
    protected $password;
}

这个实体当然有一些基本属性,如id,用户名和密码。为了扩展这一点,我为自己的包创建了一个基本用户:

/**
 * @ORM\Table()
 * @ORM\Entity()
 */
class MyBaseUser extends User
{
    protected $address;
    protected $phoneNumber;
}

这当然还有一些其他属性,例如地址和电话号码。现在来了困难的部分:

  

每个用户可以是多种类型的其他用户

举一个例子,这里有两类额外的用户:

/**
 * @ORM\Table()
 * @ORM\Entity()
 */
class UserWithCar extends MyBaseUser
{
    private $brand;
    private $color;
}

/**
 * @ORM\Table()
 * @ORM\Entity()
 */
class UserWithPonyTail extends MyBaseUser
{
    private $length;
    private $color;
}

这个数据当然是完全虚构的,我不是在做一个关于用马尾辫驱动汽车的用户的应用程序...... 现在,在映射这些时,Doctrine会生成4个表,当然这是正确的。每个表都包含正确的,有限的字段数量:

User: id, username, password, discr
MyBaseUser: id, address, phoneNumber
UserWithCar: id, brand, color
UserWithPonyTail: id, length, color

如果我输入数据,我可以获得具有UserWithPonyTail所有属性的完整用户,例如MyBaseUser。如果我在同一用户的UserWithCar中有数据,我可以将该用户作为UserWithCar获取。用户可以驾驶汽车和马尾。

我的问题在于每个用户同时只能是一种类型的用户。如果用户具有mybaseuser鉴别符,则它只能用作MyBaseUser。这导致了这样的问题:当我向UserWithPonyTailRepository询问用户时,它将返回被区分的用户的实体。例如,如果我的UserWithPonyTail标识为1,我想使用UserWithPonyTailRepository检索它,但User标识为1的标识符mybaseuser我会收到一个MyBaseUser,当然不包含UserWithPonyTail的数据。

有没有办法解决这个问题,还是我完全错了?

0 个答案:

没有答案