使用FOSRestBundle将子项添加到@OneToMany bidirectionnal

时间:2015-06-08 08:52:20

标签: symfony doctrine-orm fosrestbundle

我在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;
}

1 个答案:

答案 0 :(得分:1)

您应该使用Symfony的Form Collections

该页面上列出的示例与您的要求非常相似。