У меня есть сущность, я хочу обновить ее отношение ManyToOne. У меня есть отношения FicheSynthese ManyToOne Demandeur. Когда я хочу отредактировать объект FicheSynthese, я отправляю формы FicheSynthese и Demandeur, заполненные информацией из базы данных.
Пользователь может принять решение изменить информацию Demandeur на новую. Я рассматриваю этот случай с вызовом AJAX, если Demandeur не существует, я устанавливаю поле идентификатора формы Demandeur в -1. В этом конкретном случае я хотел бы создать объект Demandeur (и в базе данных) и обновить отношение FicheSynthese <-> Demandeur.
Небольшие замечания Демандер - это абстрактный класс с наследованием в 4 различных классах. В редакции пользователь может изменить тип Demandeur или Demandeur того же типа, но все же новый.
Я несколько раз читал, что при обновлении мне нужно обновить сущность, которой принадлежало отношение. Если я правильно понял, это FicheSynthese здесь.
Некоторый код с моими сущностями:
Demandeur.php
/**
*@var Collection|FicheSynthese[]
*
*@ORM\OneToMany(targetEntity="FicheSynthese", mappedBy="demandeur", fetch="EXTRA_LAZY")
*
*/
private $ficheSynthese;
public function __construct()
{
$this->ficheSynthese = new ArrayCollection();
}
/**
* @return Collection|FicheSynthese[]
*/
public function getFicheSynthese(): Collection
{
return $this->ficheSynthese;
}
public function addFicheSynthese(FicheSynthese $ficheSynthese): self
{
if (!$this->ficheSynthese->contains($ficheSynthese)) {
$this->ficheSynthese[] = $ficheSynthese;
$ficheSynthese->setDemandeur($this);
}
return $this;
}
public function removeFicheSynthese(FicheSynthese $ficheSynthese): self
{
if ($this->ficheSynthese->contains($ficheSynthese)) {
$this->ficheSynthese->removeElement($ficheSynthese);
// set the owning side to null (unless already changed)
if ($ficheSynthese->getDemandeur() === $this) {
$ficheSynthese->setDemandeur(null);
}
}
return $this;
}
FicheSynthese.php
/**
* @var \Demandeur
*
* @ORM\ManyToOne(targetEntity="Demandeur",
* inversedBy="ficheSynthese", cascade={"persist"})
* @ORM\JoinColumn(name="idDemandeur", referencedColumnName="id")
*/
private $demandeur;
public function getDemandeur(): ?Demandeur
{
return $this->demandeur;
}
public function setDemandeur(?Demandeur $demandeur): self
{
$this->demandeur = $demandeur;
return $this;
}
Теперь мой контроллер (немного грязно):
$em = $this->getDoctrine()->getManager('fichesynthese');
//My Demandeur form
$formsDem[$typeDem]->handleRequest($request);
//I get my Demandeur entity filled
$dem = $formsDem[$typeDem]->getData();
//I get the ID
$id = $dem->getId();
//If ID is -1 that means that my Demandeur doesn't exist
if ($id == -1) {
//I detach the old Demandeur entity, I don't want to remove it
$em->detach($dem);
//I create a new Demandeur entity (which should be the same as $dem)
$newDem = $formsDem[$typeDem]->getData();
//I attach the $newDem to my FicheSynthese that I'm currently editing
$fs->setDemandeur($newDem);
$em->flush();
}
Я начинаю с Symfony, поэтому мое понимание Доктрины иСущности и т. Д. В том, что мне не нужно сохранять $ fs, поскольку это форма издания. Если я сбрасываю $ fs, я принимаю во внимание смену Демандера. Проблема в базе данных, она создает новый Demandeur, но не меняет внешний ключ в таблице FicheSynthese. Кроме того, он не обновляет отношение в сущности Демандера.
Я предполагаю, что с -1 идентификатором он не может обновить отношение, но тогда я не понимаю, как это может работать при полном создании(от FicheSynthese и Demandeur).
Больше информации, в моем контроллере у меня есть форма для FicheSynthese и формы массива для Demandeur со всеми типами форм. С наследованием я не нашел, как встроить его в форму FicheSynthese.
Что я не понял в Учении и обновлении? Благодарю.
Редактировать: добавить геттеры / сеттеры.