嗨,我有一個操作,將人添加到一個組中。實體持續發現之前存在的新關係
爲了增加可用性,表格爲它刪除了已經在組中的人員。
我控制器操作是這樣的:
public function addAction(UserGroup $userGroup)
{
$tempGroup = new UserGroup();
foreach ($userGroup->getUsers() as $user) {
$tempGroup->addUser($user);
}
$form = $this->container->get('form.factory')->create(new UserGroupQuickType(), $tempGroup);
$request = $this->container->get('request');
if ('POST' === $request->getMethod()) {
$form->submit($request);
if ($form->isValid()) {
$group = $form->getData();
/** @var $myUserManager UserManager */
$myUserManager = $this->container->get('strego_user.user_manager');
/** @var $em EntityManager */
$em = $this->container->get('em');
foreach ($group->getUsers() as $toInvite) {
$userGroup->addUser($toInvite);
}
$em->persist($userGroup);
$em->flush($userGroup);
}
}
return array(
'form' => $form->createView(),
'userGroup' => $userGroup
);
}
此代碼拋出一個異常:
A new entity was found through the relationship 'Strego\UserBundle\Entity\UserGroup#users'
that was not configured to cascade persist operations for entity: Degi.
To solve this issue: Either explicitly call EntityManager#persist() on
this unknown entity or configure cascade persist this
association in the mapping for example @ManyToOne(..,cascade={"persist"}).
與新發現的關係已經在那裏了。意思是用戶「Degi」已經在組中,並且不是新的實體。
我可以避免這個錯誤,如果我留下堅持,但然後我會得到一個異常:Entity has to be managed or scheduled for removal for single computation
。
這是由以下事實引起的我的「用戶組」實體具有的全部時間爲3的實體狀態(=分離的)
我已經使用相同的邏輯(具有臨時基等)用於實體與我的用戶組有1對1的關係,並且從那裏我可以輕鬆地將人員添加到組中。 但是這並不符合邏輯上完成同樣的事情。
更新: 我以前的更新是在錯誤的方向領先。但在這裏比較(幾乎)相同的控制器,該控制器的工作原理:
public function addAction(BetRound $betRound)
{
$userGroup = new UserGroup();
foreach ($betRound->getUsers() as $user) {
$userGroup->addUser($user);
}
$form = $this->createForm(new UserGroupQuickType(), $userGroup);
$request = $this->getRequest();
if ('POST' === $request->getMethod()) {
$form->submit($request);
if ($form->isValid()) {
/** @var $betRoundManager BetRoundManager */
$betRoundManager = $this->container->get('strego_tipp.betround_manager');
/** @var $myUserManager UserManager */
$myUserManager = $this->container->get('strego_user.user_manager');
$group = $form->getData();
foreach ($group->getUsers() as $toInvite) {
if (!$betRound->getUserGroup()->hasUser($toInvite)) {
$betRound->getUserGroup()->addUser($toInvite);
}
}
$this->getDoctrine()->getManager()->flush();
return $this->redirect($this->generateUrl('betround_show', array('id' => $betRound->getId())));
}
}
return array(
'form' => $form->createView(),
'betRound' => $betRound
);
}
問題是,「新」找到的實體不是「toInvite」之一,而是其中一箇舊的。那麼我是否也必須合併所有現有的? – m0c