How to update a entry from ArrayCollection on Api-Platform?

1.4k Views Asked by At

With Symfony 5, Api Platform and Doctrine, I want to update a entity and his array collection linked.

When I send PUT request to Api Platform the main entity (UserMeasurement #17) is updated but not the child entity (UserMeasurementMeasurement #28) : a new entry is incremented and created.

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"
        }
    ]
}

(when creating POST the datas everything works fine (main entity and child entity are created))

Part of main entity :

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

Part of child entity :

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

There are 1 best solutions below

0
On BEST ANSWER

When using application/ld+json, you must provide the @id property:

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