如何更新 Api-Platform 上 ArrayCollection 的条目?

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

使用 Symfony 5,Api 平台和 Doctrine,我想更新 一个实体和他的数组集合链接。

当我向 Api 平台发送 PUT 请求时,主实体(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
     *
     * @ORM\OneToMany(
     *     targetEntity="App\Entity\UserMeasurementMeasurement",
     *     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
     *
     * @ORM\Column(type="decimal", nullable=true, precision=6, scale=2)
     * @Assert\Positive()
     * @Groups({
     *     "user_measurements_read",
     *     "user_measurements_write",
     * })
     */
    private $value;
    ...

使用application/ld+json时,您必须提供@id property:

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