Отношение ManyToOne требуется сохранить каскад

У меня проблема при попытке вставить новую сущность.

У меня есть две сущности, EquipoControl и Modelo, соотношение:

Один equipoControl может иметь одну модель.

Это мое отношение к equipoControl

EquipoControl.php

/**
     * @ORM\ManyToOne(targetEntity="Agc\ManagerBundle\Entity\Modelo", fetch="EAGER")
     * @ORM\JoinColumn(name="idModelo", referencedColumnName="idModelo")
     * @Assert\NotNull()
     * @Assert\NotBlank(message = "Por favor, escribe el modelo")
     */
    protected $modelo;

В моей модели сущности я ничего не делаю для отношений.

контроллера по умолчанию

$emDefault = $this->getDoctrine()->getManager();
                $em = $this->getDoctrine()->getManager("customer_1");

                $equipoControl = new EquipoControl();

                $actividad = $em->getRepository('AgcManagerBundle:Actividad')
                                            ->findOneBy(array('idActividad' => $idActividad));

                $formulario = $this->createForm(new EquipoControlType(array()), $equipoControl);

                $formulario->handleRequest($request);//Este metodo asocia los datos del formulario a nuestro objeto

                if ($formulario->isValid()) {
                //$idEquipoControl = $equipoControl->getIdEquipoControl();
                //Necesito comprobar que el equipo no existe y no está instalado en otra actividad
                $equipoControlExiste=$emDefault->getRepository('AgcManagerBundle:EquipoControl')->findOneBy(array('codigo'=>$equipoControl->getCodigo()));
                if (! $equipoControlExiste) {//SI EL EQUIPO NO EXISTE 

                    $equipoControl->setInstaladoEn($user->getAdministracion()->getIdAdministracion()."_".$idActividad);
                    $emDefault->persist($equipoControl);
                    $emDefault->flush();


                    $equipoActividad = new EquiposActividades();
                    $equipoActividad->setEquipoControl($equipoControl);
                    $actividadObj=$em->getRepository('AgcManagerBundle:Actividad')->findOneBy(array('idActividad'=>$idActividad));
                    $equipoActividad->setActividad($actividadObj);
                    $equipoActividad->setIdUsuario($user->getIdUser());
                    $tipoTransmision = new TipoTransmision();
                    $tipoTransmision->setIdTipoTransmision(0);
                    $protocolo = new Protocolo();
                    $protocolo->setIdProtocolo(0);
                    $equipoActividad->setTipoTransmision($tipoTransmision);
                    $equipoActividad->setProtocolo($protocolo);

                    $em->persist($equipoActividad);
                    $em->flush();

                    $message='El equipo se ha instalado convenientemente...Puede realizar su configuración.';
                    $this->get('session')->getFlashBag()->add('success',$message);
                    return $this->redirect($this->generateUrl('agc_asistente_actividad', array("paso" => "4"))."?equipoactividad=".$equipoActividad->getIdEquipoActividad());//Redireccion a otro sitio
                    }

Когда я вставляю новый EquipoControl в мою форму, пропустите ошибку:

Новый объект был найден с помощью отношения Agc\ManagerBundle\Entity\EquipoControl#modelo, который не был настроен для каскадного сохранения операций для объекта: ESD 123SR. Чтобы решить эту проблему: либо явно вызовите EntityManager#persist() для этого неизвестного объекта, либо настройте каскадное сохранение этой ассоциации в сопоставлении, например @ManyToOne(..,cascade={"persist"}).

Мне не нужно упорствовать, я просто хочу ассоциировать

1 ответ

Ваша ассоциация отображается правильно. Вам нужно сохранить Modelo юридическое лицо, прежде чем продолжать ваш EquipoControl юридическое лицо.

Скорее всего, что Modelo к которому ты относишься EquipoControl не существует или еще не сохранился. Таким образом, доктрина не может сохранять связь и предлагает вам ее каскадировать.

Обновить:

Если у вас уже есть Modelo сущности сохраняются в базе данных, вам нужно сначала загрузить Modelo затем свяжите это с EquipoControl,

Пример:

...
$entityManager = new EntityManager();
$equipo = new EquipoControl();
$modelo = $entityManager->find('Modelo', 1234);
$equipo->setModelo($modelo);
$entityManager->persist();
$entityManager->flush();
...

Update2:

Проблема вызвана тем, что вы пытаетесь сохранить экземпляр EquipoControl который имеет свойство $modelo ноль.

Похоже, это утверждение неправильно заполняет $equipoControl->modelo имущество.

$formulario = $this->createForm(new EquipoControlType(array()), $equipoControl);

Вам нужно извлечь modelo вручную сформируйте форму и установите ее в $equipoControl объект.

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