Сохраняющийся родительский объект с отношением OneToMany делает поле дочернего объекта entity_id NULL в MySQL - PullRequest
0 голосов
/ 05 февраля 2019

Итак, у меня есть приложение Symfony 4, в котором лежит моя основная сущность Structure.У него есть свойство $referent (в основном контактная информация), хранящееся со следующей ассоциацией:

/**
 * @ORM\OneToMany(targetEntity="App\Entity\Referent", mappedBy="structure", cascade={"persist"})
 */
private $referent;

с его получателями и установщиками:

/**
 * @return Collection|Referent[]
 */
public function getReferent(): Collection
{
    return $this->referent;
}

public function addReferent(Referent $referent): self
{
    if (!$this->referent->contains($referent)) {
        $this->referent[] = $referent;
        $referent->setStructure($this);
    }

    return $this;
}

public function removeReferent(Referent $referent): self
{
    if ($this->referent->contains($referent)) {
        $this->referent->removeElement($referent);
        // set the owning side to null (unless already changed)
        if ($referent->getStructure() === $this) {
            $referent->setStructure(null);
        }
    }

    return $this;
}

Обратите внимание, что весь код был автоматическигенерируется $ php bin/console make:entity.

Проблема заключается в том, что всякий раз, когда я сохраняю новую Structure форму StructureType, которая содержит несколько форм ReferentType (согласно документации ), обе *Объекты 1017 * и Referent сохраняются в базе данных, за исключением того, что для structure_id в таблице referent установлено значение NULL согласно приведенному ниже снимку экрана.

enter image description here

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

/**
 * @Route("/add", name="back_add")
 *
 * @return \Symfony\Component\HttpFoundation\Response
 */
public function add(Request $request)
{
    $structure = new Structure();

    $form = $this->createForm(StructureType::class, $structure, [
        'attr' => ['id' => 'add-form'],
    ]);

    $form->handleRequest($request);

    if ($form->isSubmitted()) {

        $structure = $form->getData();

        $manager = $this->getDoctrine()->getManager();
        $manager->persist($structure);
        $manager->flush();

        return $this->redirectToRoute('back_update', ['id' => $structure->getId()]);
    }

    return $this->render('back/add.html.twig', [
        'form' => $form->createView(),
        'action' => __FUNCTION__,
    ]);
}

Так почему это так?


Кроме того, обратите внимание, что перед добавлением , cascade={"persist"}В аннотации отношений у меня была следующая ошибка при отправке формы:

enter image description here

Любая помощь будет высоко ценится.


Edit # 1

В соответствии с просьбой, здесь обратная сторона отношения:

/**
 * @ORM\ManyToOne(targetEntity="App\Entity\Structure", inversedBy="referent")
 */
private $structure;

Witч его геттеры и сеттеры:

public function getStructure(): ?Structure
{
    return $this->structure;
}

public function setStructure(?Structure $structure): self
{
    $this->structure = $structure;

    return $this;
}

Ответы [ 2 ]

0 голосов
/ 05 февраля 2019

Чтобы форма Symfony корректно обрабатывала коллекцию с помощью сумматора / удаления, вам необходимо добавить опцию 'by_reference' => false в вашем классе StructureType.Это тот случай?

$builder->add('referents', CollectionType::class, array('by_reference' => false))

https://symfony.com/doc/current/form/form_collections.html

0 голосов
/ 05 февраля 2019

Вам не хватает аннотации JoinColumn ()

/**
 * @ORM\ManyToOne(targetEntity="App\Entity\Structure", inversedBy="referent")
 * @ORM\JoinColumn()
 */
private $structure;
...