Symfony 使用FOSRestBundle将子项添加到@OneToMany双向

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 }, {

我正在Symfony2应用程序上使用FOSRestBundle构建RESTAPI。 我想做的是允许我的POST和PUT操作,比如对一个与另一个名为Risk的实体有@OneToMany关系的产品实体,添加/删除我在JSON中过去的子项

让我给你举一个JSON的例子:

{
    "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;
}