gpt4 book ai didi

doctrine - 删除多对多表中的记录

转载 作者:行者123 更新时间:2023-12-02 14:12:22 25 4
gpt4 key购买 nike

我正在阅读 Symfony 2 书中的安全章节。

有一个带有表 USERSGROUPS 的示例。 USERSGROUPS 之间存在多对多关系,这会在数据库中创建一个名为 USERGROUPS 的表>.

我想要的是从USERGROUPS中删除一条记录,例如:

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));

我希望你能明白。

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

最佳答案

Doctrine 将数据视为对象,而不是表行。因此,用 Doctrine 术语来说,有 Group 对象(其中包含该组的用户等)和 User 对象(每个对象都有一个存储用户所在组的属性)。但没有 UserGroup 对象。 Doctrine(以及任何 ORM 系统)的想法是让开发人员忘记数据库可能需要但就程序的对象模型而言不是必需的这些中间表。

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

尝试:

$user = $em->find('User', $userId);
$user->removeGroup($groupId); //make sure the removeGroup method is defined in your User model.
$em->persist($user);
$em->flush(); //only call this after you've made all your data modifications

注意:如果你的用户模型中没有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);
}
}

关于doctrine - 删除多对多表中的记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9653493/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com