使用em-> remove($ user)删除对象会删除表中的所有对象

时间:2012-10-25 07:09:40

标签: symfony doctrine-orm

我有一个User实体,它实现UserInterface以与RBAC系统一起使用。我还没有实现整个系统。但是,当我尝试使用以下代码删除用户时,该操作将删除其他表中的所有用户和其他关联对象,然后向我抛出错误。我可以毫无问题地从其他实体中删除对象。

用户实体

class User implements UserInterface
{
 **
 * @var integer $id
 *
 * @ORM\Column(name="id", type="smallint")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 * 
protected $id;

 **
 * @var string $username
 *
 * @ORM\Column(name="username", type="string", length=20, unique=TRUE)
 * 
protected $username;

 **
 * @var string $password
 *
 * @ORM\Column(name="password", type="string", length=255)
 * 
protected $password;

 **
 * @var string $salt
 *
 * @ORM\Column(name="salt", type="string", length=255)
 * 
protected $salt;

 **
 * @var string $fullName
 *
 * @ORM\Column(name="full_name", type="string", length=60, unique=TRUE)
 * 
protected $fullName;

 **
 * @ORM\ManyToMany(targetEntity="Role", inversedBy="users", cascade={"persist", "remove"})
 * @ORM\JoinTable(name="users_roles")
 * 
 * @var ArrayCollection $userRoles
 * 
protected $userRoles;

public function __construct()
{
    $this->userRoles = new ArrayCollection();
}
}

删除操作

public function deleteUserAction($id) {
$user = $em->getRepository('ACMECompanyBundle:User')->find($id);
$currentUser = $this->get('security.context')->getToken()->getUser();
if ($id == $currentUser->getId()) {
    return new Response("You cannot delete the current user");
}        
if (!$user) {
    throw $this->createNotFoundException('No user found for id '.$id);
}
try {
    $em->remove($user);
    $em->flush();
    $msg = "User deleted!";
    $code = "OK";
} catch (DBALException $e) {
    return new Response($e);
    $msg = "User cannot be deleted!";
    $code = "ERR";
}
$response = new Response(json_encode(array('code' => $code, 'msg' => $msg)));
$response->headers->set('Content-Type', 'application/json');
return $response;
}

删除所有用户后返回的错误是

  

InvalidArgumentException:您无法从不包含标识符的EntityUserProvider刷新用户。必须使用Doctrine映射的自己的标识符序列化用户对象。

2 个答案:

答案 0 :(得分:1)

你在行动中遗漏了em的定义......用

定义它
$em = $this->getDoctrine()->getEntityManager();

它应该有效。除非你在课堂上设置它,否则你需要$this->...

答案 1 :(得分:0)

当doctrine删除用户时,它还会删除分配给该用户的所有rolles以及分配给这些角色的所有用户。因此,根据您的注释模式,这是正确的行为,因为$ userRoles注释中的cascade = {“remove”}和Role实体中$ users注释中的cascade = {“remove”}。

如果你想阻止级联删除并希望保持级联持久性从用户和角色关系中删除“删除”参数