我有一个允许用户加入用户组的ControllerAction。
通过Paramconverter获取UserGroup,用户始终是当前登录的用户。
/*
* @ParamConverter("code", class="StregoUserBundle:UserGroup", options={"mapping": {"code": "code"}})
* @param \Strego\UserBundle\Entity\UserGroup $code UserGroup Code
*/
public function joinGroupAction($code){
$userManager = $this->get('strego_user.user_manager');
$userManager->joinGroup($code, $this->getUser());
return new Message('Erfolgreich der Gruppe beigetreten', 'success');
}
$ this-> getUser正在使用Symfony2 Base Controller,它基本上是从securityContext获取用户。
我的joinGroup如下所示:
public function joinGroup(UserGroup $userGroup, User $user){
if (!$userGroup->getUsers()->contains($user)) {
$userGroup->addUser($user);
$this->em->merge($user);
$this->em->persist($userGroup);
$this->dispatcher->dispatch(
UserEvents::USER_USERGROUP_JOIN,
new UserGroupUserEvent($userGroup, $user)
);
$this->em->flush();
}
}
正如你所看到的,我已经尝试合并用户,但我仍然得到了 以下错误消息:未捕获的PHP异常 Doctrine \ ORM \ ORMInvalidArgumentException:"找到了一个新实体 通过关系&#; Strego \ UserBundle \ Entity \ UserGroup#users' 没有配置为级联实体的持久化操作:mof。 解决此问题:显式调用EntityManager#persist()on 这个未知的实体或配置级联持久存在此关联 映射例如@ManyToOne(..,cascade = {" persist"})。"
我已经对这个问题进行了很多研究,但是所有可能的原因(不合并,很明显,使用多个em)都不适用于这种情况。
我的配置如下所示:
class UserGroup extends BaseGroup {
/**
* @var Collection users
* @ORM\ManyToMany(targetEntity="User", inversedBy="userGroups" )
* @ORM\JoinTable(name="user_user_usergroup")
* @Serialize\Expose()
* @Serialize\MaxDepth(2)
* @Serialize\Groups({"usergroup"})
*
*/
protected $users;
}
class User extends BaseUser {
/**
* @var Collection userGroups
*
* @ORM\ManyToMany(targetEntity="UserGroup", mappedBy="users")
* @ORM\JoinTable(name="user_user_usergroup",
* joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="group_id", referencedColumnName="id")}
* )
*/
private $userGroups;
}
更新 我试图改变持久性,因为" User"被定义为拥有方:
public function joinGroup(UserGroup $userGroup, User $user){
if (!$userGroup->getUsers()->contains($user)) {
$user->addUserGroup($userGroup);
$this->em->persist($user);
$this->dispatcher->dispatch(
UserEvents::USER_USERGROUP_JOIN,
new UserGroupUserEvent($userGroup, $user)
);
$this->em->flush();
}
}
这导致再次插入用户,而不是插入关系。
答案 0 :(得分:4)
根据我们在教义文档中所读到的内容,不清楚哪一方是拥有方:
对于ManyToMany双向关系,任何一方都可能是 拥有一方(定义@JoinTable的一方和/或没有 使用mappedBy属性,因此使用默认的连接表。)
在您的情况下,User表定义了连接表,但也声明了" mappedBy"属于自有方的属性,而不是所有者。
您确定用户始终是经过身份验证的用户,因此数据库中存在一个用户吗?
另一篇文章,在阅读后:http://docs.doctrine-project.org/en/2.1/cookbook/entities-in-session.html 就是这样:
一个常见的错误是不要从EntityManager #incun()的返回值中获取合并的用户对象。传递给merge的实体对象不一定是从方法返回的同一对象。
所以在第一个例子中:
$this->em->merge($user);
应该成为
$user = $this->em->merge($user);