Проблема с сохранением данных в объекте OneToMany в Symfony

У меня есть связь OneToMany между врачом сущности и сущностями, испытываемыми и паркурами. Теперь, когда я пытаюсь сохранить данные моей формы ExperiencesType и ParcoursType, сохраняются все данные, кроме идентификатора врача.

Entity Doctor

/**
 * @ORM\OneToMany(targetEntity = "Doctix\MedecinBundle\Entity\Experiences", mappedBy = "medecin",  cascade = {"persist", "remove"})
 */
private $experiences;

/**
 * @ORM\OneToMany(targetEntity = "Doctix\MedecinBundle\Entity\Parcours", mappedBy = "medecin", cascade = {"persist", "remove"})
 */
private $parcours;

 public function __construct()
{
    $this->assurance = new \Doctrine\Common\Collections\ArrayCollection();
    $this->experiences =  new \Doctrine\Common\Collections\ArrayCollection();
    $this->parcours =  new \Doctrine\Common\Collections\ArrayCollection();
}

  /**
 * Get experiences
 *
 * @return \Doctix\MedecinBundle\Entity\Experiences
 */
public function getExperiences()
{
    return $this->experiences;
}

  /**
 * Get parcours
 *
 * @return \Doctix\MedecinBundle\Entity\Parcours
 */
public function getParcours()
{
    return $this->parcours;
}

Entity Experience

     /**
 * @ORM\ManyToOne(targetEntity = "Doctix\MedecinBundle\Entity\Medecin", inversedBy = "experiences")
 * @ORM\JoinColumn(name = "medecin_id", referencedColumnName = "id" , nullable=true)
 */
private $medecin;

  /**
 * Set medecin
 *
 * @param \Doctix\MedecinBundle\Entity\Medecin $medecin
 *
 * @return Experiences
 */
public function setMedecin(\Doctix\MedecinBundle\Entity\Medecin $medecin = null)
{
    $this->medecin = $medecin;

    return $this;
}

/**
 * Get medecin
 *
 * @return \Doctix\MedecinBundle\Entity\Medecin
 */
public function getMedecin()
{
    return $this->medecin;
}

Entity Parcours

  /**
 * @ORM\ManyToOne(targetEntity = "Doctix\MedecinBundle\Entity\Medecin", inversedBy = "parcours")
 * @ORM\JoinColumn(name = "medecin_id", referencedColumnName = "id")
 */
private $medecin;

  /**
 * Set medecin
 *
 * @param \Doctix\MedecinBundle\Entity\Medecin $medecin
 *
 * @return Parcours
 */
public function setMedecin(\Doctix\MedecinBundle\Entity\Medecin $medecin = null)
{
    $this->medecin = $medecin;

    return $this;
}

/**
 * Get medecin
 *
 * @return \Doctix\MedecinBundle\Entity\Medecin
 */
public function getMedecin()
{
    return $this->medecin;
}

Тогда это моя форма: MedecinCvEditType

  class MedecinCvEditType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder->remove('user')
            ->remove('specialite')
            ->add('experiences', CollectionType::class, array(
              'entry_type' => ExperienceType::class,
              'allow_add' => true,
              'allow_delete' => true
          ))
            ->add('parcours', CollectionType::class, array(
              'entry_type' => ParcoursType::class,
              'allow_add' => true,
              'allow_delete' => true
          ));
}

/**
 * @param OptionsResolver $resolver
 */
public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults(array(
        'data_class' => 'Doctix\MedecinBundle\Entity\Medecin'
    ));
}

  }

Наконец мой контроллер:

Контроллер

  public function cvEditAction(Request $request)
{
    $user = $this->getUser();
    if ($user === null) {
        throw new NotFoundHttpException('Utilisateur Inexistant');
    } else {
        $em = $this->getDoctrine()->getManager();
        $repo = $em->getRepository('DoctixMedecinBundle:Medecin');
        $medecin = $repo->findOneBy(array(
            'user' => $user,
        ));
        $form = $this->createForm('Doctix\MedecinBundle\Form\MedecinCvEditType', $medecin);
        $form->handleRequest($request);
        if ($form->isSubmitted() && $form->isValid()) {

      $em->flush();
            // creation d'un flash bag pour une notification flash
            $request->getSession()->getFlashBag()->add('Notice', 'Cv Modifié avec succés');
            // redirection
            $url = $this->generateUrl('medecin_parametre');
            // redirection permanente avec le status http 301 ::)))))
            return $this->redirect($url, 301);

        } else {
            return $this->render('DoctixMedecinBundle:Medecin:cvedit.html.twig', array(
                'form' => $form->createView()
            ));
        }
    }

}

Это скриншоты моей базы данных:

Проблема с сохранением данных в объекте OneToMany в Symfony

Спасибо

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Symfony Station Communiqué - 17 февраля 2023 г
Symfony Station Communiqué - 17 февраля 2023 г
Это коммюнике первоначально появилось на Symfony Station , вашем источнике передовых новостей Symfony, PHP и кибербезопасности.
Управление ответами api для исключений на Symfony с помощью KernelEvents
Управление ответами api для исключений на Symfony с помощью KernelEvents
Много раз при создании api нам нужно возвращать клиентам разные ответы в зависимости от возникшего исключения.
1
0
38
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Типы форм сбора имеют опцию by_reference.

https://symfony.com/doc/current/reference/forms/types/collection.html#by-reference

Установите значение false.

У вас есть parcours и experiences в вашем объекте Doctor. Вы должны создать для них методы добавления и удаления и установить там Доктора.

Пример:

/**
 * @return Collection|Experiences[]
 */
public function getExperiences(): Collection
{
    return $this->experiences;
}

public function addExperience(Experiences $exp): self
{
    $exp->setDoctor($this);

    $this->experiences->add($exp);

    return $this;
}

public function removeExperience(Experiences $exp): self
{
    $exp->setDoctor(null);

    $this->experiences->removeElement($exp);

    return $this;
}

Также читайте об удалении сирот: https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/working-with-associations.html#orphan-removal

Другие вопросы по теме

Множественность недопустима в роли «CW_FirmaCommunication_CwFirma_Source» в отношении «CW_FirmaCommunication_CwFirma»
Как разрешить ленивую инициализацию исключения для получения списка данных с помощью двунаправленного сопоставления «один ко многим» в спящем режиме
Помещение вставки отношения "один ко многим"
Отображение данных в одном представлении в структуре сущностей отношений "один-ко-многим" .net
Добавление одной ко многим записям в хранимой процедуре
Выбор данных из объединенных таблиц во взаимно-однозначном отношении
Используйте одно и то же поле объекта несколько раз с другим кодом администратора в форме сонаты
Как настроить отношения между двумя таблицами, которые имеют отношения «один ко многим» и «многие ко многим»?
Как я могу иметь отношение «один ко многим» в MySQL Nodejs?
Преобразование панд: отношения один-ко-многим в отношения один-к-одному