1

我尝试实现 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;

所以我可以只使用上面的代码,但我仍然想知道是什么导致了这个问题的发生? 提前致谢!

4

2 回答 2

0

也许如果您使用级联作品,请查看有关学说级联的文档:http: //docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/working-with-associations.html#transitive-persistence -级联操作

于 2018-01-12T16:37:39.940 回答
0

当您不使用 SchemaTool 生成所需的 SQL 时,您应该知道删除类表继承会ON DELETE CASCADE在所有数据库实现中使用外键属性。自己未能实现这一点将导致数据库中出现死行。

参考: 学说 2 文档

像下面这样运行这个 SQL 查询可能会解决您的问题

ALTER TABLE user 
ADD CONSTRAINT fk_user_1
FOREIGN KEY (id_user)
REFERENCES doctor (id_user)
ON DELETE CASCADE
ON UPDATE NO ACTION;
于 2018-01-12T16:08:38.567 回答