在许多条目中找到一个条目并编辑
Find one entry within many and edit
[设置]
- Symfony 3.4
Box
实体:['id'、'name']
Item
实体 ['id', 'name', 'type']
type
: 枚举:: 玩具、卡片、糖果
BoxItem
实体:['id'、'box_id'、'item_id']
- 每个
Box
总有一个item
,其type
是玩具
- 每个
Box
总是有一张item
其type
是卡
- 每个
Box
可以有零个或多个 (0,n) item
其 type
是 candy
[问题和文件]
我的三个实体之间存在 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。
[设置]
- Symfony 3.4
Box
实体:['id'、'name']Item
实体 ['id', 'name', 'type']type
: 枚举:: 玩具、卡片、糖果
BoxItem
实体:['id'、'box_id'、'item_id']- 每个
Box
总有一个item
,其type
是玩具 - 每个
Box
总是有一张item
其type
是卡 - 每个
Box
可以有零个或多个 (0,n)item
其type
是 candy
- 每个
[问题和文件]
我的三个实体之间存在 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。