使用Doctrine 2从Zend中删除多个到多个实体的记录

时间:2013-08-14 14:54:43

标签: php javascript ajax jquery zend-framework2

我正在研究Zend Doctrine。我有一个多对多实体groups_contacts,其中group_idcontact_id字段已链接到相关表格groupcontact,并在group中创建实体。

我在groups_contacts实体中创建了group,这是一种多对多的关系。

以下是删除操作的代码:

public function deleteGroupMemberAction() {
    $auth_service = $this->getServiceLocator()->get('doctrine.authenticationservice.orm_default');
    $objectManager = $this->getServiceLocator()->get('Doctrine\ORM\EntityManager');
    $em = $this->getServiceLocator()->get('doctrine.entitymanager.orm_default');
    $user = $auth_service->getIdentity();
    //die($_POST['g_id'] . ' removed');

    $query_deleteMember = $em->createQuery('delete from groups_contacts gc where gc.contact_id = 7 and gc.group_id = 1');

    $numDeleted = $query_deleteMember->execute();
    die($query_deleteMember. ' removed');

    $objectManager->flush();
    die($title . ' removed');
}

此函数调用了ajax调用,该函数运行正常。

我不知道为什么删除查询不起作用,我尝试了其他方法,但得到了相同的结果。有没有人有任何想法?

2 个答案:

答案 0 :(得分:0)

您必须指定实体的映射

delete from MyMapping:groups_contacts gc where gc.contact_id = 7 and gc.group_id = 1

或者放置你的命名空间:

delete from Your\Name\Space\groups_contacts gc where gc.contact_id = 7 and gc.group_id = 1

但这还不够,因为您无法直接访问这些contact_idgroup_id列。所以你必须写:

delete from MyMapping:groups_contacts gc JOIN gc.contact c JOIN gc.group g where c.id = 7 and g.id = 1

哇两个加入..这在本机SQL中应该更简单。它甚至执行那些JOINS吗?也许Doctrine会优化它,而不是在最终查询中使用JOIN。

用例有点奇怪。假设您有一个列出群组及其联系人的网站。该关系由groups_contacts表示(在站点注释中,当关系需要保存数据本身时,您应该只将其设置为单独的实体)。然后,当用户想要删除关系(断开联系人与组的联系)时,可以使用它自己的id来识别关系(由groups_contacts表示)。然后你的查询将成为:

DELETE FROM MyMapping:groups_contacts gc WHERE gc.id = <user clicked relation>

答案 1 :(得分:0)

这是解决方案

控制器

$ group = $ em-&gt; find(&#34; Application \ Entity \ Group&#34;,$ group_id);

        if ($group->getCreatedBy()->getId() == $user->getId()) {
            $contact = $em->find("Application\Entity\UserProfile", $contact_id);
            if (isset($contact)) {
                $group->getContacts()->removeElement($contact);
                $objectManager->persist($group);
                $objectManager->flush();

}

集团实体

/**
 *
 * @ORM\ManyToMany(targetEntity="UserProfile")
 * @ORM\JoinTable(name="groups_contacts",
 *      joinColumns={@ORM\JoinColumn(name="group_id", referencedColumnName="id")},
 *      inverseJoinColumns={@ORM\JoinColumn(name="contact_id", referencedColumnName="id")}
 *      )
 */

私人$联系人;

以这种方式处理多对多关系会更好,在这种情况下,您必须使用removeElement获取要从关联实体中删除的组和联系ID,然后使用相关的id保存小组