Прежде всего, я использую 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, поэтому мне, вероятно, потребуется пересмотреть этот подход в целом.