Обновите отношение ManyToOne - PullRequest
0 голосов
/ 10 октября 2019

У меня есть сущность, я хочу обновить ее отношение 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.

Что я не понял в Учении и обновлении? Благодарю.

Редактировать: добавить геттеры / сеттеры.

...