Как обновить запись из ArrayCollection на Api-платформе?

#symfony #api-platform.com

#symfony #api-platform.com

Вопрос:

С помощью Symfony 5, платформы Api и Doctrine я хочу обновить объект и его связанную коллекцию массивов.

Когда я отправляю PUT запрос на платформу Api, обновляется основная сущность ( UserMeasurement # 17), но не дочерняя сущность ( UserMeasurementMeasurement # 28): новая запись увеличивается и создается.

 PUT request : ​/api​/user_measurements​/17
{
    "date": "2020-10-20T12:11:22.609Z",
    "measurements": [
        {
            "id": "/api/user_measurement_measurements/28", // same result with "28" value
            "value": "7"
        }
    ]
}
  

(при создании POST данных все работает нормально (создаются основная сущность и дочерняя сущность))

Часть основного объекта :

  * @ApiResource(
 *     collectionOperations={"get", "post"},
 *     itemOperations={"get", "put", "delete"},
 *     normalizationContext={
 *         "groups"={"user_measurements_read"}
 *     },
 *     denormalizationContext={
 *         "groups"={"user_measurements_write"}
 *     },
 * )
class UserMeasurement
{
    ...
    /**
     * @var UserMeasurementMeasurement[]|ArrayCollection
     *
     * @ORMOneToMany(
     *     targetEntity="AppEntityUserMeasurementMeasurement",
     *     mappedBy="userMeasurement",
     *     cascade={"persist"},
     * )
     * @Groups({
     *     "user_measurements_read",
     *     "user_measurements_write",
     * })
     */
    private $measurements;
    ...
  

Часть дочерней сущности :

  * @ApiResource(
 *     collectionOperations={"get", "post"},
 *     itemOperations={"get", "put", "delete"},
 *     normalizationContext={
 *         "skip_null_values"=false,
 *         "groups"={"user_measurement_measurements_read"}
 *     },
 * )
class UserMeasurementMeasurement
{
    ...
    /**
     * @var float
     *
     * @ORMColumn(type="decimal", nullable=true, precision=6, scale=2)
     * @AssertPositive()
     * @Groups({
     *     "user_measurements_read",
     *     "user_measurements_write",
     * })
     */
    private $value;
    ...
  

Комментарии:

1. Что такое @ApiResource дочерняя сущность? Каковы ваши Accept Content-type заголовки and ?

2. Спасибо за ваш ответ. Я обновил свой вопрос и дочернюю сущность. Accept и Content-Type это «application / ld json»

Ответ №1:

При использовании application/ld json вы должны предоставить @id свойство:

 PUT request : ​/api​/user_measurements​/17
{
    "date": "2020-10-20T12:11:22.609Z",
    "measurements": [
        {
            "@id": "/api/user_measurement_measurements/28",
            "value": "7"
        }
    ]
}