Validar entidad de asociación Symfony5

10 afișări
Accesați primul mesaj necitit

Juan Diego Ocampo

necitită,
17 feb. 2021, 00:01:1717.02.2021
– symfony-es
Buenas a todos, estoy retomando el uso a symfony con su última versión, quería preguntar lo siguiente:
Tengo una entidad País con id y nombre, y otra entidad Departamento que tiene una asociación ManyToOne con país:

/**
     * @ORM\ManyToOne(targetEntity=Pais::class)
     * @ORM\JoinColumn(nullable=false)
     * @Assert\NotBlank(message="Asegurese de seleccionar el país del departamento.")
     */
    private $pais;

Resulta que quiero saber: ¿cómo valido para no eliminar el país seleccionado, si un departamento lo está usando?

Saludos y gracias. 

Daniel Morfa Vega

necitită,
17 feb. 2021, 00:14:4017.02.2021
– symfo...@googlegroups.com
Hola, te recomiendo que leas en la doc de doctrine para que comprendas bien el funcionamiento de las relaciones y su eliminación. Un mal modelado de la base de datos puede generar pérdidas en la información. 


--
--
Has recibido este mensaje porque estás suscrito al grupo "symfony-es" de Google Groups.
Para publicar en este grupo, envía un email a symfo...@googlegroups.com
Para darte de baja, envía un email a symfony-es+...@googlegroups.com
El resto de opciones puedes encontrarlas en http://groups.google.com/group/symfony-es?hl=es

---
Has recibido este mensaje porque estás suscrito al grupo "symfony-es" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a symfony-es+...@googlegroups.com.
Para ver esta conversación en el sitio web, visita https://groups.google.com/d/msgid/symfony-es/727cc00d-b29b-4f6b-b968-6b2f5e46829bn%40googlegroups.com.

Juan Diego Ocampo

necitită,
17 feb. 2021, 15:50:3317.02.2021
– symfo...@googlegroups.com
Daniel gracias por responderme, verás al final lo resolví de la manera que no quería:

PaisRepository:

public function countDepartamentos($pais){
        $em = $this->getEntityManager();
        $query = $em->createQuery("select d from App\Entity\Departamento d where d.pais = :pais")
            ->setParameter('pais', $pais);
        return count($query->getResult()) > 0 ? true : false;
    }

PaisController:

/**
     * @Route("/delete/{id}/", name="pais_delete", methods={"GET","POST"})
     */
    public function delete(Request $request, ValidatorInterface $validator, $id) {
        $em = $this->getDoctrine()->getManager();
        $pais = $em->getRepository(Pais::class)->find($id);        
        $form = $this->createForm(BorrarType::class, null);
        $form->handleRequest($request);        
        if($this->isDeleted($em, $form, $request, $validator, $pais)){
            if(!$request->request->get("sip")) {
                $em->remove($pais);
                $em->flush();
                $this->addFlash('success','País eliminado');
                return $this->redirectToRoute('pais_index');                
            }
        }        
        return $this->render('pais/delete.html.twig', [
            'pais' => $pais,
            'mensaje' => "¿Desea seleccionar el país seleccionado?",
            'form' => $form->createView(),
        ]);
    }

public function isDeleted($em, $form, $request, $validator, $pais){
        $bandera = $em->getRepository(Pais::class)->countDepartamentos($pais);
        if ($form->isSubmitted()){
            if(!$bandera){
                if($form->isValid()){
                    return true;
                } else {
                    $this->showValidations($request, $validator, $pais);
                }            
            } else {
                $request->getSession()->getFlashBag()->add('error',
                    "Hay departamentos usando este país");
            }
        }
        return false;
    }
   
    /**
     * Método para mostrar las validaciones realizadas a la entidad
     *
     * @param Request $request
     * @param ValidatorInterface $validator
     * @param type $pais
     */
    public function showValidations(Request $request, ValidatorInterface $validator, $pais){
        $errores = $validator->validate($pais);
        if(count($errores)){
            $request->getSession()->getFlashBag()->add('error', $errores[0]->getMessage());
        }
    }

Pensaba que existía un Asset como UniqueConstraint o algo por el estilo para evitarme el hacer esto. De todos modos muchas.

PD: Voy a poner otra discusión porque este otro problema que tengo la verdad me re inquieta.
Răspundeți tuturor
Răspundeți autorului
Redirecționați
0 mesaje noi