Doctrine 删除多对多表中的记录

Doctrine 删除多对多表中的记录,doctrine,symfony,many-to-many,dql,Doctrine,Symfony,Many To Many,Dql,我正在关注Symfony 2书的安全章节 有一个示例,其中有一个表用户和组。用户和组之间存在多对多关系,这在数据库中创建了一个名为用户组的表 我想从用户组中删除一条记录,例如: DELETE from USERGROUPS WHERE user_id = 1 and group_id = 1 我不知道怎么做,因为我没有USERGROUPS.php表文件 例如,使用DQL,我希望能够做到这一点: $em = $this->getDoctrine()->getEntityManage

我正在关注Symfony 2书的安全章节

有一个示例,其中有一个表
用户
用户
之间存在多对多关系,这在数据库中创建了一个名为
用户组
的表

我想从
用户组
中删除一条记录,例如:

DELETE from USERGROUPS WHERE user_id = 1 and group_id = 1 
我不知道怎么做,因为我没有
USERGROUPS.php
表文件

例如,使用DQL,我希望能够做到这一点:

$em = $this->getDoctrine()->getEntityManager();
$query = $em->createQuery(
    'DELETE FROM AcmeStoreBundle:UserGroups ug WHERE ug.user_id = :user 
    and ug.group_id = :group'
)->setParameter(array('user' => $userid, 'group' => $groupid));
我希望你能明白


那么,如何从该表中删除数据呢?

原则将数据视为对象,而不是表行。因此,从理论上讲,有组对象(其中包括组的用户)和用户对象(每个对象都有一个存储用户所在组的属性)。但是没有用户组对象。条令(以及任何ORM系统)的思想是让开发人员忘记这些中间表,这些中间表是数据库可能需要的,但对于程序的对象模型来说是不必要的

因此,您要做的是加载相关的用户对象,从其$groups属性中删除该组,并持久化修改后的用户对象。(反之亦然,即加载相关的组对象并从中删除用户。)DQL可能能够处理这个问题,但我认为没有DQL更容易做到,因为DQL的DELETE语句用于删除整个对象,而不是修改它们的属性

尝试:

注意:如果您的用户模型中没有removeGroup()方法(我认为Symfony可以为您生成一个,但我可能错了),该方法可能如下所示

//In User.php, and assuming the User's groups are stored in $this->groups, 
//and $groups is initialized to an empty ArrayCollection in the User class's constructor
//(which Symfony should do by default).

class User
{
    //all your other methods

    public function removeGroup($group)
    {
        //optionally add a check here to see that $group exists before removing it.
        return $this->groups->removeElement($group);
    }
}

除了@Ethan的回答外,单向删除也不起作用。对于这种
manytomy
关系,您必须从两个实体中调用
remove
方法,例如

$user = $em->findOneById($userId);
$group = $em->findOneById($groupId);

$user->removeGroup($group);
$group->removeUser($user);

$em->persist($user);
$em->flush();

伊桑。非常感谢你!它起作用了:)为什么symfony没有自动生成这个方法?我相信从多对多表中删除某些内容是一项非常常见的任务。是的,我一直想知道为什么symfony不生成remove方法(因为它会生成addMethods)。很高兴它成功了!如果在与此用户相关的多对多表中有1000000条记录,而我只需要删除一条记录,该怎么办?条令将加载所有记录?@AlexeyKosov条令将加载本例中的收集,为每个&每个对象加水。在这种情况下,DQL和/或QueryBuilder是解决问题的方法。在这种特殊情况下,对非类类型的method removeElement调用的phan错误
让我抓狂,您的注释
和$groups被初始化为用户类构造函数中的空ArrayCollection
帮助我解决了这个问题:我的属性在构造器。非常感谢你!您的解决方案是否等效于从col1=和col2=的表中删除?它会在联接表中进行查询吗?看起来是这样的
$user = $em->findOneById($userId);
$group = $em->findOneById($groupId);

$user->removeGroup($group);
$group->removeUser($user);

$em->persist($user);
$em->flush();