由于您的附加实体使用其他附加数据扩展User
实体,我可能会使用Class Table Inheritance。
类表继承是一种继承映射策略,其中层次结构中的每个类都映射到多个表:它自己的表和所有父类的表。子类的表通过外键约束链接到父类的表。Doctrine 2 通过在层次结构的最顶层表中使用鉴别器列来实现此策略,因为这是使用类表继承实现多态查询的最简单方法。
这样,您将拥有一个User
包含基本数据(用户名、密码、电子邮件等)的基表,然后是每个附加实体的另一个表,该表扩展User
了附加数据(例如salary
table 上的列Employee
)。
定义父实体
在这里,我们告诉 Doctrine 这User
是我们的基类。然后 Doctrine 使用一个鉴别器列来识别您的用户属于哪个实体。当然,您需要映射所有要扩展的实体User
(这里我只添加Employee
)。
/**
* @ORM\Entity(repositoryClass="AppBundle\Repository\UserRepository")
* @ORM\Table(name="user")
* @ORM\InheritanceType("JOINED")
* @ORM\DiscriminatorColumn(name="discr", type="string")
* @ORM\DiscriminatorMap({"user" = "User", "employee" = "Employee"})
*/
class User {
// your class..
}
定义子实体
/**
* @ORM\Entity(repositoryClass="AppBundle\Repository\EmployeeRepository")
* @ORM\Table(name="employee")
*/
class Employee extends User {
/**
* @ORM\Column(name="salary", type="float")
*/
private $salary;
public function setSalary($salary)
{
$this->salary = $salary;
return $this;
}
public function getSalary()
{
return $this->salary;
}
}
当然Employee
类可以覆盖父方法(例如getRoles()
,如果你实现UserInterface
into User
)。
最后(备份您的数据库并)使用php bin/console doctrine:schema:update --force
. id
Doctrine 将使用定义的数据和一个引用 relative的列创建新表User
。
因此,当普通用户登录时,Symfony 将加载User
实体,而当员工登录时,它将加载Employee
实体。