У меня есть две сущности order и orderdetail. Они связаны отношением «один ко многим».
Order.php
/**
* @ORM\OneToMany(targetEntity = "App\Entity\OrderDetail", mappedBy = "order", fetch = "EXTRA_LAZY", orphanRemoval=true, cascade = {"persist", "remove"})
*/
private $orderDetails;
OrderDetail.php
/**
* The order this detail is in.
*
* @ORM\ManyToOne(targetEntity = "App\Entity\Order", inversedBy = "orderDetails")
*/
private $order;
Когда я редактирую заказ, я хочу иметь возможность удалить одну или несколько деталей и сохранить заказ. Детали не должны существовать сами по себе.
Что я сделал до сих пор
Я добавил orphanRemoval=true, чтобы убедиться, что деталь не может существовать сама по себе, и cascade = {"persist", "remove"}, чтобы можно было удалить деталь из заказа.
В моей форме для заказа OrderType.php я добавил встроенный for с опцией 'allow_delete' => true,
->add('orderDetails', CollectionType::class, array(
'entry_type' => OrderDetailType::class,
'entry_options' => array('label' => false),
'allow_delete' => true,
'required' => false,
'by_reference' => false,
))
Я добавил немного jQuery, чтобы можно было удалить orderDetail, но это не актуально, потому что без него у меня такая же проблема, а именно:
всякий раз, когда я редактирую и сохраняю заказ, все детали заказа удаляются из этого заказа и удаляются из базы данных.
Странно то, что если я сбрасываю свой объект order в контроллер перед промывкой, все выглядит именно так, как должно. Проблема возникает в момент запуска $entityManager->flush();.
Изменения в моем контроллере не повлияли. Даже когда я удаляю почти весь код в своем контроллере, я удаляю jQuery, я редактирую заказ, ничего не касаясь, и сохраняю; все подробности удалены.
Можете ли вы сказать, что вызывает такое поведение и как это изменить?




Я понял, в чем проблема. У меня были поля формы в order detail, которые были отключены. Эти отключенные поля не были отправлены на сервер моим браузером. Это заставляет учение удалять этих детей. По этой проблеме было некоторое обсуждение здесь.
Чтобы все еще оставалось поле, которое нельзя изменить, но которое все еще отображается, я удалил атрибут disabled и добавил атрибут readonly => true в эти поля формы, и моя проблема решена.