我在Symfony2应用程序上使用FOSRestBundle构建REST API。 我想要做的是允许我的POST和PUT操作,比如在与另一个名为Risk的实体之间获得@OneToMany关系的Product实体上,添加/删除我在JSON中过去的子项。
让我举一个JSON的例子:
{
"cproduct": "ASSOC000000000999",
"risks": [
{
//first risk fields
},
{
//second risk fields
}
]
}
这是一个简单的JSON(真正的JSON有更多的字段,但这里不需要这些)。 所以这里我是我的产品ID(ASSOC000000000999),我想通过向他添加2个新风险来更新此产品。 我知道通常我必须单独使用产品ID创建Risk,但是为了满足我的应用程序的需要,我只需要向数据库发出一个请求。我希望我的用户能够创建产品,然后添加一个或多个风险,然后将其持久保存到数据库中。
如果他没有出现在通过PUT行动发送的JSON中,我希望他们能够删除孩子(风险)。
这里有一个例子,假设产品“ASSOC000000000999”存在风险“RISK1”。 如果我发送这个JSON:
{
"cproduct": "ASSOC000000000999",
"risks": [
{
“id”: “RISK2”,
//other fields
},
{ “id”: “RISK3”,
//other fields
}
]
}
On persist我希望删除RISK1。
我该怎么做?网上没有发现任何相关信息,请帮助我。 : - )
PS:对不起我的英语,这不是我的生育习惯。
编辑: 我的目标是我的问题。
当我使用HTTP PUT动词发送该JSON文件时:
{
"cfam": "AUTE",
"lpronom": "My Contract",
"riss": [{
"cris": "AS",
"lris": "Organization Law of 1901",
"lrisfic": "RCAD_FICHERCA9"
}]
}
Doctrine在RIS上执行SELECT(我的Risk表称为RIS,因此我的PROduct实体中的集合是$ riss),其中CRIS =" AS",这就是我的问题。在这里,如果复合PK {cpro,nprover,cris}不存在,我希望doctrine创建一个RIS,如果存在,则需要更新。
我该怎么做?
(如果可能,不使用Symfony表格。)
这是我的API调用:
http://localhost/web/web/app_dev.php/fos/api/pros/ASSOC000000000009_1
我的putProAction():
public function putProAction($id, Request $request)
{
$detachedEntity = $this->reqDeserialize($request, 'Namespace\Bundle\ProductBundle\Entity\Pro');
// Here I need to explode my serialized PUT parameter ID
list($cpro, $nprover) = explode('_', $id);
$detachedEntity->setCPRO($cpro);
$detachedEntity->setNPROVER($nprover);
$em = $this->getDoctrine()->getManager();
// I use merge to attache the entity to perform the persist
$entity = $em->merge($detachedEntity);
$em->persist($entity);
$em->flush();
return $entity;
}