在许多条目中找到一个条目并编辑

Find one entry within many and edit

[设置]

[问题和文件]

我的三个实体之间存在 OneToMany <=> ManyToOne 关系,BoxItem 是中间的一个。
当我坚持 Box 时,一些默认值被坚持到 BoxItem.

我的问题是当我想编辑 BoxItem 中的数据时,我不知道如何获取我需要的数据。

我需要的是一个editAction(),我们称之为toyAction()来编辑当前预选的玩具,另一个是编辑预选的卡片。
糖果只是添加或删除。

谁能给我一个例子,说明我需要如何编写 toyAction() 才能获取唯一关联的 `item['toy]' 并进行更改?

这是我现在的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,但我仍然遇到同样的错误。

An exception has been thrown during the rendering of a template ("Invalid option(s) passed to @ParamConverter: box").

其次,事实上,我正在寻找每个具有 box_id 的条目,我需要扩展搜索并加入 Item 以获得唯一一个 type 的条目属性将设置为 toy 和 return 一个条目或 null。

所以如果我们保持你的联想(加上评论)我会这样处理。

 /**
 * @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。