Доктрина слияния сущности с однонаправленным OneToMany не очищает записи базы данных - PullRequest
0 голосов
/ 08 ноября 2018

Прежде всего, я использую Doctrine v2.6.2 с Symfony v4.1.7.

У меня есть сущность Product, которая (помимо прочего) имеет однонаправленное отношение «один ко многим» с другой сущностью AlternativeDuration. Следуя документации Doctrine, отображение в моем классе продуктов выглядит так:

/**
 * @ORM\ManyToMany(
 *     targetEntity="AlternativeDuration",
 *     cascade={"persist", "merge", "remove"},
 *     orphanRemoval=true
 *   )
 * @ORM\JoinTable(name="ProductAlternativeDurations",
 *   joinColumns={@ORM\JoinColumn(name="product_id", referencedColumnName="id", onDelete="CASCADE", nullable=false)},
 *   inverseJoinColumns={@ORM\JoinColumn(name="alternative_duration_id", referencedColumnName="id", unique=true, onDelete="CASCADE", nullable=false)}
 * )
 */
 protected $alternativeDurations;

Мое приложение недавно начало использовать React, это означает, что теперь я отправляю JSON-представление моего продукта (вместе с массивом альтернативных длительностей), которое мне необходимо десериализовать в сущность Product в серверной части. Для этого я использую сериализатор JMS с конфигурацией по умолчанию.

Теперь проблема, с которой я сталкиваюсь при редактировании существующего продукта, у продукта уже есть альтернативная продолжительность, которую я удаляю. Представленный JSON выглядит следующим образом:

{
    "id": 1,                      # the ID of the existing product here
    "alternativeDurations": []    # empty array because the entry is removed
}

В серверной части я успешно десериализовал строку JSON:

$serializedProduct = $this->serializer->deserialize($jsonString, Product::class, 'json');

Я подтвердил, что $serializedProduct не имеет альтернативных длительностей. Затем я следую слиянием + флэш. Я ожидаю, что слияние получит существующий продукт и дополнит его $serializedProduct.

$em->merge($serializedProduct);    # $em being the EntityManager.
$em->flush();

Теперь я ожидаю, что запись AlternativeDuration вместе с удалением записи таблицы присоединения ProductAlternativeDurations. В результате, однако, запись в ProductAlternativeDurations удаляется, но AlternativeDuration все еще там.

Сейчас я в растерянности, кто-нибудь может подсказать, почему запись AlternativeDuration не удалена?

РЕДАКТИРОВАТЬ 19-11-2018:

Кажется, это известная ошибка в Doctrine: # 2542

Кроме того, merge будет удалено в Doctrine3, поэтому мне, вероятно, потребуется пересмотреть этот подход в целом.

...