2016-04-27 1 views
1

J'ai un problème avec mes entités et contrôleurs dans Symfony. Je voudrais insérer sur ma valeur DB dans une table plusieurs à plusieurs généré.Doctrine Symfony Plusieurs à plusieurs insert

entité Demandes avec seulement beaucoup à de nombreux éléments

class Requests { 
    /** 
* @ORM\ManyToMany(targetEntity="Tipi", inversedBy="requests") 
* @ORM\JoinTable(name="tipi_richieste") 
*/ 
private $tipi; 


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


/** 
* Add tipi 
* 
* @param \AppBundle\Entity\Tipi $tipi 
* 
* @return Requests 
*/ 
public function addTipi(\AppBundle\Entity\Tipi $tipi) { 
    $this->tipi[] = $tipi; 

    return $this; 
} 

/** 
* Remove tipi 
* 
* @param \AppBundle\Entity\Tipi $tipi 
*/ 
public function removeTipi(\AppBundle\Entity\Tipi $tipi) { 
    $this->tipi->removeElement($tipi); 
} 

/** 
* Get tipi 
* 
* @return \Doctrine\Common\Collections\Collection 
*/ 
public function getTipi() { 
    return $this->tipi; 
} 
} 

Entité Tipi avec seulement beaucoup à de nombreux éléments

class Tipi { 
/** 
* @ORM\ManyToMany(targetEntity="Requests", mappedBy="tipi") 
*/ 
private $requests; 


    /** 
* Constructor 
*/ 
public function __construct() { 
    $this->requests = new \Doctrine\Common\Collections\ArrayCollection(); 
} 

     /** 
* Add request 
* 
* @param \AppBundle\Entity\Requests $request 
* 
* @return Tipi 
*/ 
public function addRequest(\AppBundle\Entity\Requests $request) 
{ 
    $this->requests[] = $request; 

    return $this; 
} 

/** 
* Remove request 
* 
* @param \AppBundle\Entity\Requests $request 
*/ 
public function removeRequest(\AppBundle\Entity\Requests $request) 
{ 
    $this->requests->removeElement($request); 
} 

/** 
* Get requests 
* 
* @return \Doctrine\Common\Collections\Collection 
*/ 
public function getRequests() 
{ 
    return $this->requests; 
} 
} 

Le type de formulaire pour insérer est un EntityType

->add('tipi', EntityType::class, array(
       'label' => 'Tipo', 
       'class' => 'AppBundle:Tipi', 
       'mapped' => false, 
       'attr' => array('class' => 'form-control'), 
       'multiple' => true, 
       'by_reference' => false, 
       'query_builder' => function (EntityRepository $er) { 
      return $er->createQueryBuilder('t'); 
     }, 
      )) 

Et dans mon contrôleur, je travaille de cette façon:

public function indexAction(Request $request) { 

    $requests = new Requests(); 
    $em = $this->getDoctrine()->getManager(); 
    $form = $this->createForm(RequestsType::class, $requests); 
    $form->handleRequest($request); 


    if ($form->isSubmitted() && $form->isValid()) { 
     $requests->setCreateAt(new \DateTime('now')); 

      $request_tipi = $form["tipi"]->getData(); 
      $tipi_array = []; 
      die($form["tipi"]->getData()); 
      $tipi_array = $em->getRepository('AppBundle:Tipi')->findOneBy(array('codice' => $form["tipi"]->getData())); 
     $tipi = new Tipi(); 
     $requests->addTipi($form["tipi"]->getData()); 
     $em->persist($requests); 
     $em->flush(); 

     //return $this->redirectToRoute('immovable_edit', array('id' => $immovables->getId())); 
    } 
    return $this->render('AppBundle:Requests:index.html.twig', array(
       'requests' => $requests, 
       'form' => $form->createView(), 
    )); 
} 

Quand je mets mourir pour retourner la valeur de $form["tipi"]->getData() je reçois une collection de tableau:

Doctrine\Common\Collections\[email protected] 

Mais je reçois cette erreur

Catchable Fatal Error: Argument 1 passed to AppBundle\Entity\Requests::addTipi() must be an instance of AppBundle\Entity\Tipi, instance of Doctrine\Common\Collections\ArrayCollection given, called in C:\xampp\htdocs\bugaro\src\AppBundle\Controller\RequestsController.php on line 31 and defined

+0

Personnellement, j'ai trouvé que 'EntityType' correspond le mieux pour un à plusieurs et [' CollectionType'] (https://symfony.com/doc/current/reference/forms/types/collection.html) pour beaucoup à plusieurs - l'avez-vous déjà essayé? – kero

+0

@kingkero oui, ça marche bien. –

Répondre

0

Request::addTipi() auj ajoute unique tipis à son interne collection. Par conséquent, vous ne pouvez pas ajouter ArrayCollection entier dans l'appel.

Vous avez deux options.

Faites un foreach

foreach($form["tipi"]->getData() as $tipi) { 
    $requests->addTipi($tipi); 
} 

Créer multisetter comme Requests::addCollections(ArrayCollection[])

public function addTipis($tipis) { 

    foreach($tipis as $tipi) { 
     $this->tipi[] = $tipi; 
    } 

    return $this; 
} 

Quoi qu'il en soit, il y a beaucoup de choses à corriger dans votre code. Trop pour un seul article ici.

Mais le plus important de ces correctifs est que vous n'avez pas besoin de la plupart du code de votre contrôleur. ;-)

Puisque vous passez $requests objet dans la forme, il est déjà bined dans les deux sens, ce qui signifie que le composant formulaire de symfony doit remplir automatiquement ses propriétés avec de nouvelles valeurs. Cela comprend de nombreuses collections de relations.

De même, si vous ne transmettez pas cet objet, $form->getData() doit renvoyer une nouvelle instance Resnponses, vous n'avez donc pas besoin de le créer et de le passer manuellement jusqu'à l'édition de l'instance existante.

+0

Maintenant, merci de travailler: D @dragoste –

+0

Salut, désolé. Je l'implémente avec collectiontype et je reçois maintenant cette erreur ** Valeur attendue de type "Doctrine \ Common \ Collections \ array" pour le champ d'association "AppBundle \ Entity \ Requests # $ tipi", a obtenu "array" à la place. ** ... –