我尝试实现 Doctrine 的类表继承。我的应用程序需要一个用户实体,用于通过Symfony的安全系统对用户进行身份验证。最重要的是,我的应用程序需要一种特殊的用户,医生。您可以在下面找到我的实体类的摘录。
用户类(基础):
/**
* @ORM\Entity(repositoryClass="AppBundle\Repository\UserRepository")
* @ORM\Table(name="user")
* @UniqueEntity("email")
* @ORM\InheritanceType("JOINED")
* @ORM\DiscriminatorColumn(name="discr", type="string")
* @ORM\DiscriminatorMap({"user" = "User", "doctor" = "Doctor"})
*/
class User implements UserInterface, \Serializable, EquatableInterface {
/**
* @ORM\Id()
* @ORM\Column(name="id", type="uuid_binary")
* @ORM\GeneratedValue(strategy="CUSTOM")
* @ORM\CustomIdGenerator(class="Ramsey\Uuid\Doctrine\UuidGenerator")
* @JMS\Type("uuid")
*/
private $id;
// More fields that are used for authenticating a user (password, email, etc.)
}
医生实体扩展用户:
/**
* @ORM\Entity(repositoryClass="AppBundle\Repository\DoctorRepository")
* @ORM\Table(name="doctor")
* @ORM\HasLifecycleCallbacks()
*/
class Doctor extends User {
/**
* @ORM\Column(name="title", type="string")
*/
private $title;
// More fields that extend the User Entity
}
奇怪的是,我既不能删除Users
也不能Doctors
使用 EntityManager 的remove()
方法,我从来没有遇到过问题。当我使用该方法时,不会引发或记录任何错误,但 Entity 实例仍保留在数据库中。
// This does not work. The user stays persisted in the database.
public function deleteUserAction($id) {
$em = $this->getDoctrine()->getManager();
$user = $em->getRepository('AppBundle:User')->find($id);
if(empty($user)) {
return new View('User not found', Response::HTTP_NOT_FOUND);
}
$em->remove($user);
$em->flush();
return new View('Deleted user', Response::HTTP_OK);
}
我找到了一种解决方法,使用手动查询从数据库中删除对象。
// This works. The User is deleted from the database.
// If the user is a doctor the doctor referencing the user id is also
// deleted.
$qb = $em->createQueryBuilder()
->delete('AppBundle:User', 'u')
->where('u.id = :id')
->setParameter('id', $id, 'uuid_binary');
$qb->getQuery()->execute();
return $user;
所以我可以只使用上面的代码,但我仍然想知道是什么导致了这个问题的发生? 提前致谢!