在多个中查找一个条目并进行编辑

时间:2018-05-03 18:45:00

标签: symfony controller symfony-3.4

[设置]

  • Symfony 3.4
  • Box实体:[' id',' name']
  • Item实体[' id',' name',' type']
    • type:enum :: 玩具,卡片,糖果
  • BoxItem实体:[' id',' box_id',' item_id']
    • 每个Box始终有一个item type 玩具
    • 每个Box始终有一个item type
    • 每个Box可以有零个或多个(0,n)itemtype 糖果

[问题& FILES]

我的三个实体之间有OneToMany <=> ManyToOne关系,BoxItem是中间实体 当我保留Box时,某些默认值会保留在BoxItem

我的问题是当我想要编辑BoxItem中的数据时,我无法弄清楚如何获取我需要的数据。

我需要的是editAction(),我们会调用toyAction()来编辑当前预先选定的玩具,另一个用于编辑预先选择的卡片。
只需添加或删除糖果。

有人能给我一个例子,告诉我如何写toyAction()所以我可以获取唯一相关的`item [&#39; toy]&#39;并改变它?

这是我目前的toyAction()

BoxItemController

/**
 * @Route("boxitem-toy-{boxId}", name="boxitem_toy")
 * @ParamConverter("boxItem", options={"box"="boxId"})
 * @Method({"GET", "POST"})
 *
 * @param Request $request
 * @param BoxItem $boxItem
 *
 * @return \Symfony\Component\HttpFoundation\RedirectResponse|\Symfony\Component\HttpFoundation\Response
 */
public function toyAction(Request $request, BoxItem $boxItem) {
    $editForm=$this->createForm(BoxItemToyType::class, $boxItem);
    if($request->isMethod('POST')) {
        if($editForm->isSubmitted() && $editForm->isValid()) {
            $this->getDoctrine()->getManager()->flush();

            return $this->json(array('submit_status'=>true));
        } else {
            return $this->json(array('submit_status'=>false));
        }
    } else {
        return $this->render('boxitem/toy.html.twig', array(
            'boxItem'=>$boxItem,
            'edit_form'=>$editForm->createView(),
        ));
    }
}

当前代码至少存在两个问题。

首先,在@ParamConverter注释中,box未被识别。我猜测原因是box属性是OneToMany <=> ManyToOne关系,因此我没有使用正确的语法。我尝试了box_id,但我仍然遇到同样的错误。

  

在渲染模板期间抛出异常(&#34;传递给@ParamConverter的无效选项:框&#34;)。

其次,我正在寻找具有正确box_id的每个条目,我需要扩展搜索并加入Item以获得唯一的条目type {1}}属性将设置为 toy 并返回一个条目或null。

1 个答案:

答案 0 :(得分:1)

因此,如果我们保持你的关联(注释),我会这样做。

 /**
 * @Route("boxitem-toy-{box}", name="boxitem_toy")
 * @Method({"GET", "POST"})
 */
 public function toyAction(Request $request, Box $box) {
    $toyBoxItem = null;
    foreach ($box->getItems() as $item) { // Iterate though all items
        if ($item->getType() == 'Card') { // Your check if this is card item... 
            $toyBoxItem = $item;
            break;
        }
    }

    if ($toyBoxItem == null) {
        throw new NotFoundException(); // We dont have item
    }

    // ... rest of your code
}

解释一下。因为我们将Box作为参数并且我们通过id加载它,所以我们不需要ParamConverted,它应该找到它。

接下来我们需要获取ToyItem(我在函数中写了它,但实际上最好将该代码移动到实体/服务 - 类似于$box->getToyItem() ...)。

接下来作为参数,您不会获得BoxItem,而是从中获取实体的关联实体Box。类似于cardAction。