Skip to content

PUT queries on a Resource with a composite key fail with a duplicate key error #6234

Open
@bertrandjamin

Description

@bertrandjamin

API Platform version(s) affected:
3.2.16

Description
After an update in the latest version of ApiPlatform (from v2.7.x)
Each PUT calls on Resources with composite keys fail with a duplicate error.

It seems that the detection of the existing object fails and so the doctrine flush() try to create the resource rather than updated it.

The limitation seems known (

// TODO: the call to getReference is most likely to fail with complex identifiers
) but I prefer to create an issue so we can follow the resolution.

How to reproduce

  • create a Resource (also Doctrine entity) with a composite Id
  • POST a new resource
  • Set a PUT on this resource
  • The error is triggered

Possible Solution

Awaiting a resolution I have added a specific Processor as workaround

<?php

namespace App\State\Processor;

use ApiPlatform\Metadata\Operation;
use ApiPlatform\Metadata\Put;
use ApiPlatform\State\ProcessorInterface;
use App\Entity\Admin\EntityInterface;
use Doctrine\ORM\EntityManagerInterface;
use Exception;

/**
 * @implements ProcessorInterface<EntityInterface,EntityInterface>
 */
class CompositeIdentifierPutProcessor implements ProcessorInterface
{
    public function __construct(
        private readonly EntityManagerInterface $entityManager,
    ) {
    }

    /**
     * @throws Exception
     */
    public function process(
        mixed $data,
        Operation $operation,
        array $uriVariables = [],
        array $context = []
    ): EntityInterface {

        if (!$operation instanceof Put) {
            throw new Exception('Invalid Operation');
        }

        if (isset($uriVariables['id']['identifiers']) && count($uriVariables['id']['identifiers']) < 2) {
            throw new Exception('This processor should only be used for a Resource with composite identifier');
        }

        $this->entityManager->flush();
        return $data;
    }

}

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions