首页 > 解决方案 > 如何从 Api-Platform 上的 ArrayCollection 更新条目?

问题描述

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

当我向PUTApi Platform 发送请求时,主实体(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;
    ...

标签: symfonyapi-platform.com

解决方案


使用时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"
        }
    ]
}

推荐阅读