2014-04-27 32 views
1

我有一個ControllerAction允許用戶加入用戶組。SecurityContext用戶不是由EntityManager管理,「找到了新的實體」

UserGroup通過Paramconverter獲取,用戶始終是當前登錄的用戶。

/* 
* @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'); 
} 

$這 - >的getUser使用Symfony2的基本控制器,其被基本上得到從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異常 學說\ ORM \ ORMInvalidArgumentException :「通過關係'Strego \ UserBundle \ Entity \ UserGroup#users' 發現一個新實體 未被配置爲級聯實體的持久操作:mof。 要解決此問題:顯式調用EntityManager#persist()在 這個未知實體或配置級聯在 的映射中堅持這個關聯,例如@ManyToOne(..,cascade = {「persist」})。「

我已經研究了很多關於這個問題,但所有可能的原因(不合並,em明確,使用多個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; 
} 

更新 我試圖改變周圍的堅持,因爲「用戶」被定義爲擁有方:

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

導致再次插入用戶,而不是插入關係。

回答

4

不清楚哪邊是基於我們的文檔閱讀教義擁有方:

對於多對多雙向關係,任何一方可以是定義@JoinTable的 擁有側(邊和/或不使 使用mappedBy屬性,因此使用默認連接表)。

在你的情況下,用戶表定義了連接表,但也聲明屬於擁有方,而不是擁有者的「mappedBy」屬性。

您確定用戶始終是經過身份驗證的用戶,因此數據庫中現有的用戶是?

另一個薄,看完後在這裏:http://docs.doctrine-project.org/en/2.1/cookbook/entities-in-session.html 是:

一個常見的錯誤是不從的EntityManager#合併的返回值獲得合併後的用戶對象()。傳遞給合併的實體對象不一定是從方法返回的同一個對象。

所以在第一個例子:

$this->em->merge($user); 

應該成爲

$user = $this->em->merge($user); 
+0

我更新了我的問題,我的地圖,我映射多對多 – m0c

+0

我更新我的回答,希望它有助於 –

+0

那做了詭計,非常感謝。我從幾個小時開始正在調試,並且變得瘋狂。 – m0c

相關問題