我正在研究Zend Doctrine。我有一个多对多实体groups_contacts
,其中group_id
和contact_id
字段已链接到相关表格group
和contact
,并在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调用,该函数运行正常。
我不知道为什么删除查询不起作用,我尝试了其他方法,但得到了相同的结果。有没有人有任何想法?
答案 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_id
和group_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保存小组