我目前正在一个简单的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
的数据。
有没有办法解决这个问题,还是我完全错了?