0

我正在研究 Zend Doctrine。我有一个多对多实体groups_contacts,它具有字段group_idcontact_id链接到相关表groupcontactgroup实体中创建。

我正在创建一个多对多关系的实体groups_contactsgroup

以下是删除操作的代码:

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 调用,它工作得很好。

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

4

2 回答 2

0

这是解决方案

控制器

$group = $em->find("Application\Entity\Group", $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")}
 *      )
 */

私人 $contacts;

最好以这种方式处理多对多关系,其中您必须使用 removeElement 获取要从关联实体中删除的组和联系人 id,然后使用组的相关 id 持久化

于 2013-08-27T10:32:49.920 回答
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 表示(在站点注释上,当关系需要自己保存数据时,您应该只将其设为单独的实体)。然后,当用户想要删除关系(从组中断开联系人)时,关系(由 groups_contacts 表示)可以用它自己的 id 来标识。那么您的查询将变为:

DELETE FROM MyMapping:groups_contacts gc WHERE gc.id = <user clicked relation>
于 2013-08-14T16:45:56.807 回答