Partage
  • Partager sur Facebook
  • Partager sur Twitter

Symfony, afficher entités relation OneToMany

    3 juillet 2020 à 13:40:24

    Bonjour à tous, 

    Dans le cadre d'un stage en entreprise je dois réaliser un site internet avec Symfony, leur permettant d'afficher et de modifier la liste de leur client, ainsi que les devis qui leur sont associés.

    Cependant, je bloque sur un problème. J'ai deux entités "Client" et "Devis" qui sont relié par une relation OneToMany. Un client peut avoir plusieurs devis, mais un devis n'est relié qu'à un seul client.

    Les donnés du client s'affiche bien, mais je ne parviens pas afficher celle du devis qui lui sont relié.

    Si quelqu'un pourrait me donner un coup de main en jetant un oeil sur le code se serais top !

    Merci pour votre aide.

    Voici mon entité Client :

    <?php
    
    namespace App\Entity;
    
    use App\Repository\ClientRepository;
    use Doctrine\Common\Collections\ArrayCollection;
    use Doctrine\Common\Collections\Collection;
    use Doctrine\ORM\Mapping as ORM;
    
    /**
     * @ORM\Entity(repositoryClass=ClientRepository::class)
     */
    class Client
    {
        /**
         * @ORM\Id()
         * @ORM\GeneratedValue()
         * @ORM\Column(type="integer")
         */
        private $id;
    
        /**
         * @ORM\Column(type="string", length=255)
         */
        private $NomClient;
    
        /**
         * @ORM\OneToMany(targetEntity=Devis::class, mappedBy="client")
         */
        private $relation;
    
        public function __construct()
        {
            $this->relation = new ArrayCollection();
        }
    
        public function getId(): ?int
        {
            return $this->id;
        }
    
        public function getNomClient(): ?string
        {
            return $this->NomClient;
        }
    
        public function setNomClient(string $NomClient): self
        {
            $this->NomClient = $NomClient;
    
            return $this;
        }
    
        /**
         * @return Collection|Devis[]
         */
        public function getRelation(): Collection
        {
            return $this->relation;
        }
    
        public function addRelation(Devis $relation): self
        {
            if (!$this->relation->contains($relation)) {
                $this->relation[] = $relation;
                $relation->setClient($this);
            }
    
            return $this;
        }
    
        public function removeRelation(Devis $relation): self
        {
            if ($this->relation->contains($relation)) {
                $this->relation->removeElement($relation);
                // set the owning side to null (unless already changed)
                if ($relation->getClient() === $this) {
                    $relation->setClient(null);
                }
            }
    
            return $this;
        }
    }


    L'entité Devis :

    <?php
    namespace App\Entity;
    
    use App\Repository\DevisRepository;
    use Doctrine\ORM\Mapping as ORM;
    
    /**
     * @ORM\Entity(repositoryClass=DevisRepository::class)
     */
    class Devis
    {
        /**
         * @ORM\Id()
         * @ORM\GeneratedValue()
         * @ORM\Column(type="integer")
         */
        private $id;
    
        /**
         * @ORM\Column(type="string", length=255)
         */
        private $NumeroDevis;
    
        /**
         * @ORM\Column(type="datetime")
         */
        private $DateDevis;
    
        /**
         * @ORM\ManyToOne(targetEntity=Client::class, inversedBy="relation")
         */
        private $client;
    
        public function __construct() 
        {
            $this->DateDevis = new \DateTime();
        }
    
        public function getId(): ?int
        {
            return $this->id;
        }
    
        public function getNumeroDevis(): ?string
        {
            return $this->NumeroDevis;
        }
    
        public function setNumeroDevis(string $NumeroDevis): self
        {
            $this->NumeroDevis = $NumeroDevis;
    
            return $this;
        }
    
        public function getDateDevis(): ?\DateTimeInterface
        {
            return $this->DateDevis;
        }
    
        public function setDateDevis(\DateTimeInterface $DateDevis): self
        {
            $this->DateDevis = $DateDevis;
    
            return $this;
        }
    
        public function getClient(): ?Client
        {
            return $this->client;
        }
    
        public function setClient(?Client $client): self
        {
            $this->client = $client;
    
            return $this;
        }
    }

    Mon controller : 

    <
    <?php
    
    namespace App\Controller;
    
    use Symfony\Component\Routing\Annotation\Route;
    use App\Entity\Client;
    use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
    
    
    
    class ClientController extends AbstractController
    {
        /**
         * @Route("/", name="Client_index")
         */
    
        public function accueilClient()
        {
    
            $repository = $this->getDoctrine()->getRepository(Client::class);
            $Clients = $repository->findAll();
            return $this->render("home/index.html.twig", [
                "Clients" => $Clients
            ]);
        }
    }

    La vue twig :

    {% block body %}
    	<small>
    		home/index.html.twig
    	</small>
    <div class="container">
    
    	<h1>Page d'Accueil</h1>
    	<h2>Hello le World</h2>
    
    	{% for Client in Clients %}
    	<table class="table">
    		<thead>
    			<tr>
    				<th scope="col">#</th>
    				<th scope="col">Nom Client</th>
    				<th scope="col">Numero du Devis</th>
    				<th scope="col">Date Devis</th>
    			</tr>
    		</thead>
    		<tbody>
    			<tr>
    				<th scope="row"></th>
    				<td>{{Client.NomClient}}</td>
    				{% for Devis in Client.relation %}
    				<td>{{Devis.NumeroDevis}}</td>
    				<td>{{Devis.getDateDevis()| date('d-m-Y')}}</td>
    				{% endfor %}
    			</tr>
    		</tbody>
    	</table>
        {% endfor %}
    </div>
    {% endblock %}
     

    -
    Edité par KochiSymeon 3 juillet 2020 à 13:43:32

    • Partager sur Facebook
    • Partager sur Twitter
      3 juillet 2020 à 13:56:36

      Salut

      Histoire de ne pas m'embrouiller, j'aurais utilisé un pluriel pour la propriété qui porte la relation de Client vers Devis, donc relations.

      Cela mis à part, une erreur quelconque à nous transmettre ? Parce que « ça ne marche pas » et « je n'y arrive pas », c'est maigre comme piste pour t'aider.

      Je note que là, tu vas avoir pour chaque devis d'un client deux colonnes supplémentaires sur la ligne, alors que ta ligne d'en-têtes possède un nombre fixe de colonnes. Ton tableau de résultat aura une drôle d'allure…

      -
      Edité par Ymox 3 juillet 2020 à 13:57:52

      • Partager sur Facebook
      • Partager sur Twitter
        3 juillet 2020 à 16:42:11

        Salut,

        je suis de l'avis a Ymox c'est pas super intuitif comme nom de relation, surtout si par le suite ton client pourra avoir des relations avec  d'autre entité...

        Sinon à la ligne 26 de ta vue twig:

        <td>{{Devis.getDateDevis()| date('d-m-Y')}}</td>

        tu utilise une fonction qui te sert dans ton code php, pas pour twig. Il te suffit d'afficher la date comme n'importe quel autre element... 

        <td>{{Devis.DateDevis| date('d-m-Y')}}</td>

        Est-ce la seul erreur ? Si ça ne marche toujours pas il nous faudrait un screen des erreurs de symfony

        • Partager sur Facebook
        • Partager sur Twitter
          7 juillet 2020 à 12:06:50

          Bonjour,

          Merci pour vos réponses. 

          J'ai effectivement changé le nom de mes relations pour que se soit plus clair !

          Sinon j'ai trouvé la solution, j'ai enlevé la deuxième boucle dans ma vue. Je met ici la vue twig pour ceux qui veulent

          <h1>Liste Devis</h1>
          
          		{% for Devis in pagination %}
          			<table class="table">
          				<thead>
          					<tr>
          						<th scope="col">#</th>
          						<th scope="col">Nom Client</th>
          						<th scope="col">Numero du Devis</th>
          						<th scope="col">Date Devis</th>
          					</tr>
          				</thead>
          				<tbody>
          					<tr>
          						<th scope="row"></th>
          						<td>{{Devis.NumeroDevis}}</td>
          
          						<td>{{Devis.client.NomClient}}</td>
          
          						<td>{{Devis.getDateDevis()| date('d-m-Y')}}</td>
          					</tr>
          				</tbody>
          			</table>
          		{% endfor %}

          Merci quand même pour vos réponses !
          la prochaine fois je tâcherais de plus détailler mes erreurs.

          • Partager sur Facebook
          • Partager sur Twitter

          Symfony, afficher entités relation OneToMany

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown