[设置]
Box
实体:[' id',' name'] Item
实体[' id',' name',' type']
type
:enum :: 玩具,卡片,糖果 BoxItem
实体:[' id',' box_id',' item_id']
Box
始终有一个item
type
玩具 Box
始终有一个item
type
卡 Box
可以有零个或多个(0,n)item
,type
糖果 [问题& 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。
答案 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。