Relation bidirectionelle Symfony

Résolu/Fermé
cerco25 Messages postés 8 Date d'inscription mercredi 14 décembre 2016 Statut Membre Dernière intervention 10 juin 2017 - Modifié par cerco25 le 14/12/2016 à 11:14
Chris 94 Messages postés 50978 Date d'inscription mardi 8 janvier 2008 Statut Modérateur Dernière intervention 17 février 2023 - 19 déc. 2016 à 15:45
Bonjour

J'ai 2 entités avec les mêmes champs (date, billet, nom, prenom)... une entité Billet, une entité Commande relier avec une relation bidirectionnelle (ManyToOne de Billet à Commande). L'entité commande contient des champs supplémentaires que j'ai mis à nullable = true pour le moment , (je veux récupérer les infos de billet sur commande)...

J'ai ajouté dans ma méthode addBillet de mon entité commande :
$billet->setCommande($this);

et j'ai lié ma commande à mon billet dans mon controller :
$commande->addBillet($billet);

Mon problème c'est que je n'arrive pas à hydrater commande en base de données.

Si je mets tous les champs de mon entité commande à "nullable = true", l'hydratation
fonctionne sur billet mais pas sur commande, sur commande tout sera vide, logique.
Bref, je n'arrive pas à hydrater commande. J'ai passé toute ma journée hier à essayer différentes méthodes sans succès, c'est pour ça que je poste ici...

Si quelqu'un peut m'aider...je vous mets le code de la méthode de mon controller et de mes 2 entités :

Entité Billet

<?php

namespace saya25\LouvreBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Billet
 *
 * @ORM\Table(name="billet")
 * @ORM\Entity(repositoryClass="saya25\LouvreBundle\Repository\BilletRepository")
 */
class Billet
{


    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;



    /**
     * @var bool
     *
     * @ORM\Column(name="date_visite", type="date")
     */
    private $dateVisite;


    /**
     * @var bool
     *
     * @ORM\Column(name="status", type="boolean")
     */
    private $status;


    /**
     * @var string
     *
     * @ORM\Column(name="nom", type="string", length=150, nullable=false)
     */
    private $nom;


    /**
     * @var string
     *
     * @ORM\Column(name="Pays", type="string", length=255)
     */
    private $pays;



    /**
     * @var string
     *
     * @ORM\Column(name="prenom", type="string", length=150, nullable=false)
     */
    private $prenom;


    /**
     * @var date
     *
     * @ORM\Column(name="dateNaissance", type="date", nullable=false)
     */
    private $dateNaissance;


    /**
     * @var boolean
     *
     * @ORM\Column(name="tarifReduit", type="boolean", nullable=false)
     */
    private $tarifReduit;



    /**
     * @var float
     *
     * @ORM\Column(name="prix", type="float", nullable=true)
     */
    private $prix;



     /**
     * @ORM\ManyToOne(targetEntity="saya25\LouvreBundle\Entity\Commande", inversedBy="billet", cascade={"persist", "remove"})
     */
    private $commande;


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

    /**
     * Set nom
     *
     * @param string $nom
     *
     * @return Billet
     */
    public function setNom($nom)
    {
        $this->nom = $nom;

        return $this;
    }

    /**
     * Get nom
     *
     * @return string
     */
    public function getNom()
    {
        return $this->nom;
    }

    /**
     * Set prenom
     *
     * @param string $prenom
     *
     * @return Billet
     */
    public function setPrenom($prenom)
    {
        $this->prenom = $prenom;

        return $this;
    }

    /**
     * Get prenom
     *
     * @return string
     */
    public function getPrenom()
    {
        return $this->prenom;
    }

    /**
     * Set dateNaissance
     *
     * @param \DateTime $dateNaissance
     *
     * @return Billet
     */
    public function setDateNaissance($dateNaissance)
    {
        $this->dateNaissance = $dateNaissance;

        return $this;
    }

    /**
     * Get dateNaissance
     *
     * @return \DateTime
     */
    public function getDateNaissance()
    {
        return $this->dateNaissance;
    }

    /**
     * Set tarifReduit
     *
     * @param boolean $tarifReduit
     *
     * @return Billet
     */
    public function setTarifReduit($tarifReduit)
    {
        $this->tarifReduit = $tarifReduit;

        return $this;
    }

    /**
     * Get tarifReduit
     *
     * @return boolean
     */
    public function getTarifReduit()
    {
        return $this->tarifReduit;
    }

    /**
     * Set prix
     *
     * @param float $prix
     *
     * @return Billet
     */
    public function setPrix($prix)
    {
        $this->prix = $prix;

        return $this;
    }

    /**
     * Get prix
     *
     * @return float
     */
    public function getPrix()
    {
        return $this->prix;
    }

    /**
     * Set commande
     *
     * @param \saya25\LouvreBundle\Entity\Commande $commande
     *
     * @return Billet
     */
    public function setCommande(\saya25\LouvreBundle\Entity\Commande $commande = null)
    {
        $this->commande = $commande;

        return $this;
    }

    /**
     * Get commande
     *
     * @return \saya25\LouvreBundle\Entity\Commande
     */
    public function getCommande()
    {
        return $this->commande;
    }

    /**
     * Set pays
     *
     * @param string $pays
     *
     * @return Billet
     */
    public function setPays($pays)
    {
        $this->pays = $pays;

        return $this;
    }

    /**
     * Get pays
     *
     * @return string
     */
    public function getPays()
    {
        return $this->pays;
    }

    /**
     * Set status
     *
     * @param boolean $status
     *
     * @return Billet
     */
    public function setStatus($status)
    {
        $this->status = $status;

        return $this;
    }

    /**
     * Get status
     *
     * @return boolean
     */
    public function getStatus()
    {
        return $this->status;
    }


    public function tarifBillet(Billet $billet)
    {

        $newBillet = $billet->getBillet();
        $dateNaissance = $newBillet->getDateNaissance();

        $dateInterval = $dateNaissance->diff(new \DateTime());


        if ($dateInterval->age < 12) {
            $billet->setPrix(Billet::TARIF_ENFANT);
            return $this;

        }
    }



    /**
     * Set dateVisite
     *
     * @param \DateTime $dateVisite
     *
     * @return Billet
     */
    public function setDateVisite($dateVisite)
    {
        $this->dateVisite = $dateVisite;

        return $this;
    }

    /**
     * Get dateVisite
     *
     * @return \DateTime
     */
    public function getDateVisite()
    {
        return $this->dateVisite;
    }






}




Entité commande :
<?php

namespace saya25\LouvreBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use saya25\LouvreBundle\Form\CommandeType;

/**
 * Commande
 *
 * @ORM\Table(name="commande")
 * @ORM\Entity(repositoryClass="saya25\LouvreBundle\Repository\CommandeRepository")
 * @ORM\HasLifecycleCallbacks()
 */
class Commande
{
    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="nom", type="string", length=255)
     */
    private $nom;

    /**
     * @var string
     *
     * @ORM\Column(name="prenom", type="string", length=255)
     */
    private $prenom;



    /**
     * @var string
     *
     * @ORM\Column(name="email", type="string", length=255, nullable=true)
     */
    private $email;



    /**
     * @var \DateTime
     *
     * @ORM\Column(name="dateCommande", type="datetime", nullable=true)
     */
    private $dateCommande;

    /**
     * @var \DateTime
     *
     * @ORM\Column(name="dateEntree", type="datetime", nullable=true)
     */
    private $dateEntree;


    /**
     * @var string
     *
     * @ORM\Column(name="numeroReservation", type="string", length=255, nullable=true)
     */
    private $numeroReservation;


    /**
     * @var float
     *
     * @ORM\Column(name="total", type="float", nullable=true)
     */
    private $total;



    /**
     * @ORM\OneToMany(targetEntity="saya25\LouvreBundle\Entity\Billet", mappedBy="commande", cascade={"persist"})
     */
    private $billet;

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

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

    /**
     * Set nom
     *
     * @param string $nom
     *
     * @return Commande
     */
    public function setNom($nom)
    {
        $this->nom = $nom;

        return $this;
    }

    /**
     * Get nom
     *
     * @return string
     */
    public function getNom()
    {
        return $this->nom;
    }

    /**
     * Set prenom
     *
     * @param string $prenom
     *
     * @return Commande
     */
    public function setPrenom($prenom)
    {
        $this->prenom = $prenom;

        return $this;
    }

    /**
     * Get prenom
     *
     * @return string
     */
    public function getPrenom()
    {
        return $this->prenom;
    }

    /**
     * Set dateCommande
     *
     * @param \DateTime $dateCommande
     *
     * @return Commande
     */
    public function setDateCommande($dateCommande)
    {
        $this->dateCommande = $dateCommande;

        return $this;
    }

    /**
     * Get dateCommande
     *
     * @return \DateTime
     */
    public function getDateCommande()
    {
        return $this->dateCommande;
    }

    /**
     * Set dateEntree
     *
     * @param \DateTime $dateEntree
     *
     * @return Commande
     */
    public function setDateEntree($dateEntree)
    {
        $this->dateEntree = $dateEntree;

        return $this;
    }

    /**
     * Get dateEntree
     *
     * @return \DateTime
     */
    public function getDateEntree()
    {
        return $this->dateEntree;
    }

    /**
     * Set numeroReservation
     *
     * @param string $numeroReservation
     *
     * @return Commande
     */
    public function setNumeroReservation($numeroReservation)
    {
        $this->numeroReservation = $numeroReservation;

        return $this;
    }

    /**
     * Get numeroReservation
     *
     * @return string
     */
    public function getNumeroReservation()
    {
        return $this->numeroReservation;
    }


    /**
     * Add billet
     *
     * @param \saya25\LouvreBundle\Entity\Billet $billet
     *
     * @return Commande
     */
    public function addBillet(\saya25\LouvreBundle\Entity\Billet $billet)
    {
        $this->billet[] = $billet;

        $billet->setCommande($this);
    }

    /**
     * Remove billet
     *
     * @param \saya25\LouvreBundle\Entity\Billet $billet
     */
    public function removeBillet(\saya25\LouvreBundle\Entity\Billet $billet)
    {
        $this->billet->removeElement($billet);
    }

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

    /**
     * Set total
     *
     * @param float $total
     *
     * @return Commande
     */
    public function setTotal($total)
    {
        $this->total = $total;

        return $this;
    }

    /**
     * Get total
     *
     * @return float
     */
    public function getTotal()
    {
        return $this->total;
    }

    /**
     * Set email
     *
     * @param string $email
     *
     * @return Commande
     */
    public function setEmail($email)
    {
        $this->email = $email;

        return $this;
    }

    /**
     * Get email
     *
     * @return string
     */
    public function getEmail()
    {
        return $this->email;
    }



}






Méthode de mon controller :
 public function billetterieAction(Request $request)
    {

        $commande = new Commande();
        $billet = new billet();
        $form = $this->createForm(BilletType::class, $billet);

        if ($request->isMethod('POST') && $form->handleRequest($request)->isValid()){

            $commande->addBillet($billet);
            $em = $this->getDoctrine()->getManager();
            $em->persist($billet);
            $em->flush();

            return $this->redirectToRoute('saya25_louvre_billetterie', array('id' => $billet->getId()));
        }

        $listeBillets =  $this->getDoctrine()->getManager()->getRepository('saya25LouvreBundle:Billet')->findAll();

        return $this->render('saya25LouvreBundle:Ticket:billetterie.html.twig', array(
            'listeBillets' => $listeBillets,
            'form' => $form->createView(),
        ));
    }



Donc voilà, le problème vient de mon controller, je n'arrive pas à hydrater commande...

Merci pour votre aide

1 réponse

cerco25 Messages postés 8 Date d'inscription mercredi 14 décembre 2016 Statut Membre Dernière intervention 10 juin 2017
15 déc. 2016 à 11:08
Personne pour m'aider via skype, teamviewer ? c'est vraiment important, je pense pas que ce soit (super compliquer), à mon avis j'ai juste un petit truc à changer mais je n'y arrive pas. Je peux toujours donner un petit quelque chose à celui qui m'aide...
0
Chris 94 Messages postés 50978 Date d'inscription mardi 8 janvier 2008 Statut Modérateur Dernière intervention 17 février 2023 7 341
19 déc. 2016 à 15:45
Bonjour,

Les réponses sont données gratuitement par des bénévoles, selon leurs compétences et dans le temps libre dont ils disposent. Si nous apprenions que certains se font payer, cela ne resterait pas sans conséquences !

Si ça n'est pas super-compliqué, tu dois avoir les éléments pour régler ton souci. Dans le cas contraire, il faut qu'un bénévole ait le temps d'analyser les quelques 800 lignes de ton code pour trouver la faille !
0