В Symfony, как удалить связи связанных сущностей ManyToMany в форме редактирования

У меня есть форма создания для сущности, которая работает так, как она должна. Сущность для этой формы связана ManyToMany с другой сущностью, и эта другая сущность используется для заполнения поля множественного выбора.

Когда я сохраняю форму создания и выбираю несколько вариантов из этого поля множественного выбора, связи между сущностью типа формы и связанной сущностью сохраняются правильно.

Тем не менее, у меня также есть форма редактирования, которая использует тот же класс и шаблон типа формы. Когда я загружаю форму редактирования и информация о существующей сущности заполняется в ней автоматически, я вижу, что отношения с сущностью с несколькими полями выбора действительно отражаются; соответствующие поля поля множественного выбора выбраны.

Когда я иду, чтобы сохранить форму редактирования, когда возникает проблема. Если я выберу опции в поле множественного выбора, я ожидаю, что при сохранении формы редактирования эти опции станут несвязанными, но это не так. Вместо этого исходные отношения сохраняются, как будто никакие параметры не были изменены.

Что еще мне нужно сделать, чтобы, когда я ДЕЛЕКТИВНО выбрал опции для множественного выбора, эти опции стали не связанными? Спасибо!

В сущности:

/**
* unidirectional ManyToMany
* @ORM\ManyToMany(targetEntity="\Myco\ClientBundle\Entity\Country", cascade={"persist"}, orphanRemoval=true)
* @ORM\JoinTable(name="offer_country",
*      joinColumns={@ORM\JoinColumn(name="offer_id", referencedColumnName="id")},
*      inverseJoinColumns={@ORM\JoinColumn(name="country_id", referencedColumnName="id")}
*      )
* */
private $countries;

/**
* This is method getCountries
*
* @return ArrayCollection
*
*/
public function getCountries()
{
return $this->countries;
}

В типе формы, вот как создается поле множественного выбора:

->add('countries', 'entity', [
'class' => 'ClientBundle:Country',
'property' => 'name',
'required' => false,
'expanded' => false,
'multiple' => true,
'mapped' => true
])

В контроллере есть функции, связанные с редактированием:

/**
* Displays edit form
*
* @throws NotFoundHttpException
*
* @param Request $request
* @param int $id
*/
public function editAction(Request $request, $id)
{
$em = $this->getDoctrine()->getManager();
$offer = $em->getRepository('ClientBundle:Offer')->find($id);

if (!$offer)
{
throw new NotFoundHttpException('Offer not found!');
}

$this->setEditForm($offer, '/offer/editPost/' . $id);

return [
'form' => $this->form->createView(),
'devicesForm' => $this->getDevicesForm('/devices/listJson')->createView(),
'gate' => $this->gate
];
}

/**
* Handles submission of edit form
*/
public function editPostAction(Request $request, $id)
{
$em = $this->getDoctrine()->getManager();
$offer = $em->getRepository('ClientBundle:Offer')->find($id);

if (!$offer)
{
throw new NotFoundHttpException('Offer not found!');
}

$this->setEditForm($offer);
$this->form->handleRequest($request);

if (!$this->form->isValid())
{
throw new InvalidArgumentException('Unable to save this item due to invalid argument(s).');
}

return ['form' => $this->form->createView()];
}

/**
* Sets up $this->form as a new edit form with the specified Offer
*
* @param Offer $offer
*/
protected function setEditForm($offer, $action = '')
{
$this->setOffer($offer);
$this->form = $this->createForm(new OfferType, $this->offer, ['action' => $action]);
$this->form->add('submit', 'submit');
}

/**
* Sets $this->offer
* @param Offer $offer
*/
protected function setOffer(Offer $offer = null)
{
if (!$offer)
{
$offer = new Offer;
}

$this->offer = $offer;
}

0

Решение

В editPostAction отсутствует следующее:

$em->persist($this->offer);
$em->flush();

Это работает сейчас. Я надеюсь, что это поможет кому-то еще пропустить один или оба этих звонка в будущем.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]