Я создаю REST API с FOSRestBundle в своем приложении Symfony2. Что я хочу сделать, так это разрешить мои действия POST и PUT, скажем, для объекта Product, у которого есть отношение @OneToMany с другим объектом, называемым Risk, для добавления/удаления дочерних элементов, которые я пропустил в JSON.
Позвольте мне привести вам пример JSON:
{
"cproduct": "ASSOC000000000999",
"risks": [
{
//first risk fields
},
{
//second risk fields
}
]
}
Это простой JSON (у настоящего больше полей, но здесь они не нужны). Итак, вот у меня есть свой Product ID (ASSOC000000000999) и я хочу обновить этот продукт, добавив к нему 2 новых риска. Я знаю, что обычно мне пришлось бы создавать риск с идентификатором продукта отдельно, но для нужд моего приложения мне нужно сделать только один запрос к базе данных. Я хочу, чтобы мои пользователи могли создать продукт, затем добавить один или несколько рисков и только после этого сохранить его в базе данных.
Во второй раз я хотел бы, чтобы они могли удалить ребенка (риск), если он не появляется в JSON, отправленном с действием PUT.
Вот пример, пусть продукт «ASSOC000000000999» получил риск «RISK1». Если я отправлю этот JSON:
{
"cproduct": "ASSOC000000000999",
"risks": [
{
“id”: “RISK2”,
//other fields
},
{ “id”: “RISK3”,
//other fields
}
]
}
При сохранении я хочу, чтобы RISK1 был удален.
Как я могу это сделать? Я ничего не нашел в Интернете об этом, пожалуйста, помогите мне. :-)
PS: Извините за мой английский, это не мой родной язык.
РЕДАКТИРОВАТЬ: я нацелен на то, в чем на самом деле заключается моя проблема.
Когда я отправляю этот файл JSON с глаголом HTTP PUT:
{
"cfam": "AUTE",
"lpronom": "My Contract",
"riss": [{
"cris": "AS",
"lris": "Organization Law of 1901",
"lrisfic": "RCAD_FICHERCA9"
}]
}
Doctrine выполняет SELECT на RIS (моя таблица Risk называется RIS, поэтому коллекция $riss в моем объекте PROduct), где CRIS = "AS", и это моя проблема. Здесь я хочу, чтобы доктрина создавала RIS, если составной ПК {cpro, nprover, cris} не существует, и обновление, если оно существует.
Как я могу это сделать?
(По возможности без использования формы 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;
}