将许多项目分配给一个类别 - OneToMany Relation

时间:2015-06-01 17:33:59

标签: symfony doctrine-orm symfony-forms

我想将多个项目分配到一个类别。我正在使用Symfony 2.6.7。

我不在这里。如果我打开这个URI:

/类别/ 2 /分配

[x] Item 1
[x] Item 2
(Save Button)

我可以通过复选框选择多个项目。

这是我的数据库表"项目",我想连接两者:

id | category_id

这是OneToMany关系,其中One = Category,Many = Items。

我如何在这里指定两者?

当我编辑一个项目而不是选择此项目的类别时,它已经可以使用了。现在我在类别方面,在这里我想为这一类别选择许多项目。有人可以帮帮忙吗? : - )

1 个答案:

答案 0 :(得分:1)

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 doctrine注释的属性的实体是当您要在两个表之间创建新链接时应该采取操作的实体。这就是为什么您可以为项目分配类别但不向项目添加项目的原因。

以上代码是标准的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 与原始答案相同。现在试试吧,告诉我它是否有效。

同样,再次,初步应该有效。