我想将许多项目分配给一个类别。我正在使用 Symfony 2.6.7。
我不属于这里的所有者。如果我打开这个 URI:
/类别/2/分配
[x] Item 1
[x] Item 2
(Save Button)
我可以通过复选框选择许多项目。
这是我的数据库表“Item”,我想在其中连接两者:
id | category_id
这是一个 OneToMany 关系,其中 One = Category,Many = Items。
如何在这里分配两者?
当我编辑一个项目并为该项目选择一个类别时,它已经开始工作了。现在我在类别一侧,在这里我想为这个类别选择许多项目。有人可以帮忙吗? :-)
public function updateAction(Request $request, $id) {
$em = $this->getDoctrine()->getManager();
$entity = $em->getRepository('YourBundle:Category')->find($id);
if (!$entity) {
throw $this->createNotFoundException('Unable to find Category entity.');
}
$editForm = $this->createEditForm($entity);
$editForm->bind($request);
if ($editForm->isValid()) {
foreach ($editForm->get('items')->getData()->getValues() as $u)
$u->setCategory($entity);
$em->flush();
return $this->redirect($this->generateUrl('category_show', array('id' => $id)));
}
return $this->render('YourBundle:Category:edit.html.twig', array(
'entity' => $entity,
'edit_form' => $editForm->createView(),
));
}
请参阅,在 Symfony2 中,当您想要在两个表之间创建新链接时,具有带有 inversedBy 学说注释的属性的实体是应该采取操作的实体。这就是为什么您可以为项目分配类别,但不能将项目添加到类别。
上面的代码是标准 CRUD 生成的 Symfony2 updateAction 函数。唯一的调整是 foreach,从而强制为您在表单中选择的每个项目分配一个类别。
虽然很简陋,但很有效。
注意:我没有提供从类别中删除项目的解决方法,但类似的方法可以做到这一点。希望有帮助。
编辑:删除项目:
public function updateAction(Request $request, $id) {
$em = $this->getDoctrine()->getManager();
$entity = $em->getRepository('YourBundle:Category')->find($id);
if (!$entity) {
throw $this->createNotFoundException('Unable to find Category entity.');
}
//new line
$before = $entity->getItems()->getValues();
$editForm = $this->createEditForm($entity);
$editForm->bind($request);
//new line
$after = $entity->getItems()->getValues();
if ($editForm->isValid()) {
//new lines
$UNselected = array_diff($before, $after);
foreach ($UNselected as $u) {
$u->setCategory(null);
}
foreach ($after as $u) {
$u->setCategory($entity);
}
//new lines - end
$em->flush();
return $this->redirect($this->generateUrl('category_show', array('id' => $id)));
}
return $this->render('YourBundle:Category:edit.html.twig', array(
'entity' => $entity,
'edit_form' => $editForm->createView(),
));
}
相同的功能,只是包含新行。
array_diff 将返回在提交之前链接到类别实体且不在提交之后的项目,然后再次使用 foreach,您可以将 null 指定为每个项目的类别,即:打破它们之间的联系。
第二个 foreach 与原始答案的作用相同。现在就这样尝试一下,然后告诉我是否有效。
再次,基本的,再次,应该可以工作。