将多个项目分配给一个类别 - 一对多关系

问题描述 投票:0回答:1

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

我不属于这里的所有者。如果我打开这个 URI:

/类别/2/分配

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

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

这是我的数据库表“Item”,我想在其中连接两者:

id | category_id

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

如何在这里分配两者?

当我编辑一个项目并为该项目选择一个类别时,它已经开始工作了。现在我在类别一侧,在这里我想为这个类别选择许多项目。有人可以帮忙吗? :-)

php symfony doctrine-orm symfony-forms
1个回答
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 学说注释的属性的实体是应该采取操作的实体。这就是为什么您可以为项目分配类别,但不能将项目添加到类别。

上面的代码是标准 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 与原始答案的作用相同。现在就这样尝试一下,然后告诉我是否有效。

再次,基本的,再次,应该可以工作。

© www.soinside.com 2019 - 2024. All rights reserved.