Добавьте дочерний элемент в двунаправленный @OneToMany с помощью FOSRestBundle.

Я создаю 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;
}

person Maxime Meunier    schedule 08.06.2015    source источник


Ответы (1)


Вам следует использовать Коллекции форм Symfony.

Пример, указанный на этой странице, очень похож на ваши требования.

person Maltronic    schedule 08.06.2015
comment
Спасибо за быстрый ответ, я читаю его, и я надеюсь, что это спасет меня! - person Maxime Meunier; 08.06.2015
comment
Хорошо, это отлично подходит для использования только symfon2, но я забыл вам сказать, что если мне нужен REST API, это потому, что я должен использовать AngularJS на внешней стороне. Я должен заполнить свой объект JSON, поэтому мне нужно использовать JMS для десериализации JSON в объект Doctrine. Это не будет работать с формами Symfony2. - person Maxime Meunier; 08.06.2015
comment
Вам определенно следует использовать Symfony Forms для управления вводом/выводом вашего REST API, они будут обрабатывать проверку и управление потоком. Уильям Дюран действительно написал статью на более широкую тему здесь, единственная разница в том, что вам нужно будет добавить типы коллекций для работы с подмножествами. - person Maltronic; 08.06.2015
comment
У меня есть одна проблема с формами. Если я буду их использовать, мне придется написать форму для каждой сущности в моем приложении, а это не то, что мне хотелось бы делать. Но эту идею я держу в голове и воспользуюсь, если не найду что-то другое! Танки. Считаю эту тему закрытой. - person Maxime Meunier; 09.06.2015