Symfony 使用FOSRestBundle将子项添加到@OneToMany双向
我正在Symfony2应用程序上使用FOSRestBundle构建RESTAPI。 我想做的是允许我的POST和PUT操作,比如对一个与另一个名为Risk的实体有@OneToMany关系的产品实体,添加/删除我在JSON中过去的子项 让我给你举一个JSON的例子:Symfony 使用FOSRestBundle将子项添加到@OneToMany双向,symfony,doctrine-orm,fosrestbundle,Symfony,Doctrine Orm,Fosrestbundle,我正在Symfony2应用程序上使用FOSRestBundle构建RESTAPI。 我想做的是允许我的POST和PUT操作,比如对一个与另一个名为Risk的实体有@OneToMany关系的产品实体,添加/删除我在JSON中过去的子项 让我给你举一个JSON的例子: { "cproduct": "ASSOC000000000999", "risks": [ { //first risk fields }, {
{
"cproduct": "ASSOC000000000999",
"risks": [
{
//first risk fields
},
{
//second risk fields
}
]
}
这是一个简单的JSON(真正的JSON有更多的字段,但这里不需要这些字段)。
因此,这里我有我的产品ID(ASSOC000000000999),我想通过向他添加2个新风险来更新此产品。
我知道,通常我必须单独使用产品ID创建风险,但出于应用程序的需要,我只需要向数据库发出一个请求。我希望我的用户能够创建一个产品,然后添加一个或多个风险,然后将其保存到数据库中
在第二次,我希望他们能够删除一个孩子(风险),如果他没有出现在与PUT action一起发送的JSON中
这里有一个例子,假设产品“ASSOC000000000999”有一个风险“RISK1”。
如果我发送此JSON:
{
"cproduct": "ASSOC000000000999",
"risks": [
{
“id”: “RISK2”,
//other fields
},
{ “id”: “RISK3”,
//other fields
}
]
}
在“持久化”上,我希望删除风险1
我该怎么做?我在网上找不到这方面的信息,请帮助我。:-)
对不起,我的英语,这不是我的出生语言
编辑:
我的目标是我真正的问题所在
当我用HTTP PUT动词发送JSON文件时:
{
"cfam": "AUTE",
"lpronom": "My Contract",
"riss": [{
"cris": "AS",
"lris": "Organization Law of 1901",
"lrisfic": "RCAD_FICHERCA9"
}]
}
条令对RIS进行选择(我的风险表称为RIS,因此在我的产品实体中,集合为$riss),其中CRIS=“AS”,这是我的问题。在这里,如果复合PK{cpro,nprover,cris}不存在,我想创建一个RIS,如果它存在,则创建一个更新
我该怎么做
(如有可能,不使用Symfony表格)
下面是我的API调用:
我的行动:
你应该用Symfony的
该页面上列出的示例与您的要求非常相似。谢谢您的快速回答,我正在阅读,希望这能救我一命!好的,这对于只使用symfon2来说很好,但我忘了告诉你们的是,如果我需要一个restapi,那是因为我必须在前端使用AngularJS。我必须用JSON填充我的对象,所以我需要使用JMS将JSON反序列化为一个对象。这不适用于Symfony2表单。您肯定仍然应该使用Symfony表单来控制RESTAPI的输入/输出,它们将处理验证和流控制。William Durand写了一篇关于更广泛主题的文章,唯一的区别是需要添加集合类型来处理子集。如果我使用它们,我将不得不为我的应用程序中的每个实体编写一个表单,而这不是我想要做的事情。但是我把这个想法牢记在心,如果我找不到其他东西,我会用它!坦克。我认为这个话题是封闭的。
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;
}