У меня есть следующая структура:
Свойство категории, содержащее ссылку на свойство и его значение:
<?php
class CategoryProperty
{
// ...
/**
* @var Property
*
* @ORM\ManyToOne(targetEntity="App\Entity\Property")
* @ORM\JoinColumn(onDelete="cascade", nullable=false)
*/
private $property;
/**
* Набор значений свойства доступных в product builder, null если любое значение.
*
* @var PropertyValueEntry
* @Assert\Valid
*
* @ORM\OneToOne(targetEntity="App\Entity\Properties\PropertyValues\PropertyValueEntry",
* cascade={"persist", "remove"})
*/
private $propertyValue;
// ...
}
Абстрактный тип значения свойства с картой дискриминатора:
<?php
/**
* @ORM\Entity
* @ORM\InheritanceType("JOINED")
* @ORM\DiscriminatorColumn(name="type", type="integer")
* @ORM\DiscriminatorMap({
* "1": "StringValue",
* "2": "IntegerValue",
* "3": "BooleanValue",
* "4": "TextValue",
* "6": "EnumValue",
* "7": "SetValue",
* "9": "LengthValue",
* "10": "AreaValue",
* "11": "VolumeValue",
* "12": "MassValue",
* })
* @ORM\Table(name="properties_values__value_entry")
*/
abstract class PropertyValueEntry
{
/**
* @var Property
*
* @ORM\ManyToOne(targetEntity="App\Entity\Property")
*/
private $property;
public function __construct(Property $property)
{
$this->property = $property;
}
public function getProperty(): Property
{
return $this->property;
}
/**
* @return mixed
*/
abstract public function getValue();
/**
* @param mixed $value
*/
abstract public function setValue($value): void;
}
И пример конкретного типа значения:
<?php
/**
* @ORM\Entity
* @ORM\Table(name="properties_values__integer_value")
*/
class IntegerValue extends PropertyValueEntry
{
/**
* @var int
* @Assert\NotNull
*
* @ORM\Column(type="integer")
*/
private $value = 0;
public function getValue(): int
{
return $this->value;
}
/**
* @param int|null $value
*/
public function setValue($value): void
{
if (!\is_int($value)) {
throw new InvalidArgumentException('BooleanValue accepts integer values only');
}
$this->value = $value;
}
}
По какой-то причине при отправке формы вместо обновления значения для IntegerValue создается новая сущность и новая строка в properties_values__value_entry / properties_values__integer_value. Я попытался отследить через $ this-> em-> persist ($ entity), где $ entity - это CategoryProperty, и кажется, что IntegerValue помечается как грязный и создается заново. Как я могу отследить причину этого? Моя обработка формы довольно стандартная:
<?php
public function editAction(): Response
{
$id = $this->request->query->get('id');
$easyadmin = $this->request->attributes->get('easyadmin');
$entity = $easyadmin['item'];
$isReload = 'reload' === $this->request->request->get('action');
$editForm = $this->createForm(CategoryPropertyType::class, $entity, [
'category' => $this->getCatalog(),
'is_reload' => $isReload,
]);
$deleteForm = $this->createDeleteForm($this->entity['name'], $id);
$editForm->handleRequest($this->request);
if ($editForm->isSubmitted() && $editForm->isValid()) {
if (!$isReload) {
$this->em->persist($entity);
$this->em->flush();
return $this->redirectToReferrer();
}
}
return $this->render($this->entity['templates']['edit'], [
'form' => $editForm->createView(),
'entity' => $entity,
'delete_form' => $deleteForm->createView(),
]);
}
ОБНОВЛЕНИЕ # 1 Что я уже пробовал: Получить свойство категории по идентификатору из менеджера сущностей через
$entity = $this->em->find(CategoryProperty::class, $id);
В целом это Кажется, это может быть связано с тем, что у меня есть динамическая форма c, созданная на основе выбора. Когда я добавляю свойство категории, я отображаю раскрывающийся список со списком типов свойств (целое число, строка, область, объем и т. Д. c), и после выбора отображается новая форма для этого свойства. Хотя это работает нормально и добавляет новое свойство без проблем, похоже, что в коде для РЕДАКТИРОВАНИЯ того же свойства что-то отсутствует, и вместо обновления оно создает его заново.