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

Assign many items to one category - OneToMany Relation

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

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

/category/2/assign

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

我有可能选择很多带复选框的项目。

这是我的数据库 table "Item",我想在其中连接两者:

id | category_id

这是一对多关系,其中一个 = 类别,多个 = 项目。

如何在此处分配两者?

它已经在工作了,当我编辑一个项目并且 select 一个类别到这个项目时。现在我在类别方面,在这里我想要 select 很多项目到这一类别。有人可以帮忙吗? :-)

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 中,当您想在两个表之间创建一个新的 link 时,带有 属性 和 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 将 return 提交前 linked 到类别实体且提交后不存在的项目,然后再次使用 foreach,您可以将 null 分配为每个项目的类别,即:打破它们之间的 link。

第二个 foreach 与原始答案相同。现在就这样尝试,然后告诉我它是否有效。

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