2017-03-28 1 views
2

Je dois créer un formulaire d'ajout de bus. Le bus peut avoir de nombreux équipements et c'est pourquoi j'ai créé une relation OneToMany entre les bus et les bus. Ce que je veux accomplir est de laisser Doctrine enlever (ou mettre à jour) des données de la table de OneToMany sans boucler ou faire quelque chose de particulier dans le contrôleur. Je lis quelque part que vous pouvez utiliser orphanRemoval = true annotation sur l'entité qui prendra soin de cela, mais pour une raison quelconque, il ne fonctionne pas ...Symfony 3 orphanRemoval = true ne supprime pas les enregistrements supprimés du formulaire

Je peux mettre à jour et en ajouter d'équipements (nouvelles données) mais je ne peux pas supprimer les enregistrements que j'ai précédemment supprimés du formulaire Modifier.

Peut-il être fait en utilisant orphanRemoval = true ou que quelqu'un sait où est le problème avec mon code:

Voici le code:

Entité Bus (version court-circuité):

/** 
    * @ORM\OneToMany(targetEntity="BusVehiclesAmenities", mappedBy="bus", cascade={"persist", "remove"}, orphanRemoval=true) 
    */ 
    private $busVehiclesAmenities; 

    public function __construct() 
    { 

     $this->busVehiclesAmenities = new ArrayCollection(); 
    } 



    /** 
    * Get id 
    * 
    * @return integer 
    */ 
    public function getId() 
    { 
     return $this->id; 
    } 

    /** 
    * Add busVehiclesAmenities 
    * 
    * @param \AppBundle\Entity\BusVehiclesAmenities busVehiclesAmenities 
    * @return BusVehicles 
    */ 
    public function addBusVehiclesAmenities(BusVehiclesAmenities $busVehiclesAmenities) 
    { 

     /* if ($this->busVehiclesAmenities->contains($busVehiclesAmenities)) { 
      return; 
     }*/ 
     $this->busVehiclesAmenities->add($busVehiclesAmenities); 
     $busVehiclesAmenities->addBus($this); 

     return $this; 
    } 

    /** 
    * Remove busVehiclesAmenities 
    * 
    * @param \AppBundle\Entity\BusVehiclesAmenities $busVehiclesAmenities 
    */ 
    public function removeBusVehiclesAmenities(BusVehiclesAmenities $busVehiclesAmenities) 
    { 
     $this->busVehiclesAmenities->removeElement($busVehiclesAmenities); 
     $busVehiclesAmenities->addBus(null); 


    } 
    /** 
    * Get busVehiclesAmenities 
    * 
    * @return ArrayCollection 
    */ 
    public function getBusVehiclesAmenities() 
    { 
     return $this->busVehiclesAmenities; 

    } 
    /** 
    * Set busVehiclesAmenities 
    * 
    * @return ArrayCollection 
    */ 
    public function setBusVehiclesAmenities($busVehiclesAmenities) 
    { 
     $this->busVehiclesAmenities = $busVehiclesAmenities; 

    } 

Services Entité:

private $bus; 
/** 
* 
* @ORM\ManyToOne(targetEntity="Amenities", inversedBy="amenities") 
* @ORM\JoinColumn(name="amenities_id", referencedColumnName="id") 
* 
*/ 
private $amenities; 

/** 
* @var float 
* @ORM\Column(name="price", type="float", scale=2) 
*/ 
protected $price; 

public function __construct() 
{ 
} 


/** 
* Get id 
* 
* @return integer 
*/ 
public function getId() 
{ 
    return $this->id; 
} 


/** 
* Get busId 
* 
* @return integer 
*/ 
public function getBus() 
{ 
    return $this->bus; 
} 

/** 
* Add bus 
* 
* @param \AppBundle\Entity\BusVehicles 
* 
* @return BusVehiclesAmenities 
*/ 
public function addBus(BusVehicles $bus) 
{ 

    $this->bus = $bus; 

    //$bus->setBusVehiclesAmenities($this); 


    return $this; 
} 

Controller:

public function editAction($id, Request $request) 
    { 
     $busRepository = $this->getDoctrine()->getRepository('AppBundle:BusVehicles'); 
     $bus = $busRepository->find($id); 
     $editForm = $this->createForm(BusVehiclesType::class, $bus); 
     $editForm->handleRequest($request); 
     if ($editForm->isSubmitted() && $editForm->isValid()) { 

      $em = $this->getDoctrine()->getManager(); 

      $entity = $editForm->getData(); 
      dump ($entity); 
      $em->persist($entity); //this should take care of everything saving the manyToMany records 

      $em->flush(); 

      // Adding flash message to our user 

      $this->addFlash('success', 'New vehicle successfully added'); 


      // return $this->redirectToRoute('bus_add'); 

     } 
     return [ 
      'form' => $editForm->createView(), 
     ]; 
    } 
+0

Êtes-vous sûr que vous êtes-vous en train de retirer des articles de la poste? Parce que votre code semble bien. – DonCallisto

+0

@DonCallisto. Oui, je suis sûr. Quand je débogue des données de forme) j'obtiens des données qui ont été éditées et envoyées pour former. Je peux vous montrer la sortie de débogage si vous le souhaitez. – jureispro

+0

Non, ce n'est pas nécessaire mais ça sonne comme un comportement vraiment étrange. – DonCallisto

Répondre

0

Je vais avoir le même problème, mais en regardant votre code je remarque que vous appelez

$busVehiclesAmenities->addBus(null); 

au lieu de

$busVehiclesAmenities->setBus(null);