Bonjour,

Cela fait 3 semaines que j'apprends Symfony donc tout est encore un peu frais. Donc si quelqu'un pouvait me donner un petit avis, un conseil pour voir où est-ce que je bloque.
Je dois créer ma page d'accueil d'application (dans le genre foires aux questions comme Quora et StackOverflow).
J'ai deux entités Questions et Tags avec une relation ManyToMany :

Entité Tag :
<?php

namespace App\Entity;

use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity(repositoryClass="App\Repository\TagRepository")
 */
class Tag
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=64)
     */
    private $tagName;

    /**
     * @ORM\ManyToMany(targetEntity="App\Entity\Question", mappedBy="tags")
     */
    private $questions;

    public function __construct()
    {
        $this->questions = new ArrayCollection();
    }

    public function getId(): ?int
    {
        return $this->id;
    }

    public function getTagName(): ?string
    {
        return $this->tagName;
    }

    public function setTagName(string $tagName): self
    {
        $this->tagName = $tagName;

        return $this;
    }

    /**
     * @return Collection|Question[]
     */
    public function getQuestions(): Collection
    {
        return $this->questions;
    }

    public function addQuestion(Question $question): self
    {
        if (!$this->questions->contains($question)) {
            $this->questions[] = $question;
            $question->addTag($this);
        }

        return $this;
    }

    public function removeQuestion(Question $question): self
    {
        if ($this->questions->contains($question)) {
            $this->questions->removeElement($question);
            $question->removeTag($this);
        }

        return $this;
    }
}


Entité Question :
<?php

namespace App\Entity;

use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity(repositoryClass="App\Repository\QuestionRepository")
 */
class Question
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

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

    /**
     * @ORM\Column(type="text")
     */
    private $description;

    /**
     * @ORM\OneToMany(targetEntity="App\Entity\Response", mappedBy="question", cascade={"persist"})
     */
    private $responses;

    /**
     * @ORM\ManyToMany(targetEntity="App\Entity\Tag", inversedBy="questions")
     */
    private $tags;

    /**
     * @ORM\Column(type="datetime")
     */
    private $createdAt;

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\User", inversedBy="questions")
     */
    private $user;


    public function __construct()
    {
        $this->responses = new ArrayCollection();
        $this->tags = new ArrayCollection();
    }

    public function getId(): ?int
    {
        return $this->id;
    }

    public function getTitleQuestion(): ?string
    {
        return $this->titleQuestion;
    }

    public function setTitleQuestion(string $titleQuestion): self
    {
        $this->titleQuestion = $titleQuestion;

        return $this;
    }

    public function getDescription(): ?string
    {
        return $this->description;
    }

    public function setDescription(string $description): self
    {
        $this->description = $description;

        return $this;
    }

    /**
     * @return Collection|Response[]
     */
    public function getResponses(): Collection
    {
        return $this->responses;
    }

    public function addResponse(Response $response): self
    {
        if (!$this->responses->contains($response)) {
            $this->responses[] = $response;
            $response->setQuestion($this);
        }

        return $this;
    }

    public function removeResponse(Response $response): self
    {
        if ($this->responses->contains($response)) {
            $this->responses->removeElement($response);
            // set the owning side to null (unless already changed)
            if ($response->getQuestion() === $this) {
                $response->setQuestion(null);
            }
        }

        return $this;
    }

    /**
     * @return Collection|Tag[]
     */
    public function getTags(): Collection
    {
        return $this->tags;
    }

    public function addTag(Tag $tag): self
    {
        if (!$this->tags->contains($tag)) {
            $this->tags[] = $tag;
        }

        return $this;
    }

    public function removeTag(Tag $tag): self
    {
        if ($this->tags->contains($tag)) {
            $this->tags->removeElement($tag);
        }

        return $this;
    }

    public function getCreatedAt(): ?\DateTimeInterface
    {
        return $this->createdAt;
    }

    public function setCreatedAt(\DateTimeInterface $createdAt): self
    {
        $this->createdAt = $createdAt;

        return $this;
    }

    public function getUser(): ?User
    {
        return $this->user;
    }

    public function setUser(?User $user): self
    {
        $this->user = $user;

        return $this;
    }
}


QuestionController :
<?php

namespace App\Controller;

use App\Entity\Tag;
use App\Entity\Question;
use App\Entity\Response;
use App\Repository\QuestionRepository;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;

class QuestionController extends AbstractController
{
    /**
     * @Route("/", name="home")
     */
    public function index(QuestionRepository $questionRepository)
    {
        $repository = $this->getDoctrine()->getRepository(Tag::class);

        $questions = $questionRepository->findAllQuestionsByDate();
        
        return $this->render('question/index.html.twig', [
            'questions'=>$questions
        ]);
    }


Et pour finir ma vue Twig :
{% extends 'base.html.twig' %}

{% block title %}La FAQ-O-Clock !{% endblock %}

{% block body %}
    <div class="col-lg-12 container">
        <div class="col-lg-12 row">
            {% for q in questions %}
                <div class="card border-primary my-4 mx-3" style="max-width: 20rem;">
                    {#% for t in questions.tags %#}
                    <div class="card-header justify-content {{ cycle(['list-even', 'list-odd', 'list-other'], q.id) }}">{{questions.tagName}}</div>
                    {#% endfor %#}
                    <div class="card-body">
                        <h4 class="card-title">{{q.titleQuestion}}</h4>
                        <p class="card-text">{{q.createdAt|localizeddate('none', 'none', 'fr', null, 'EEEE d MMMM Y')}}
                            à
                            {{q.createdAt|date('H:i')}}</p>
                        <div class="btn-next d-flex justify-content-end">
                            <button type="button" class="btn next">Lire la suite</button>
                        </div>
                    </div>
                </div>
            {% endfor %}
        {% endblock %}


Si j'enlève {{questions.tagName}} de ma vue j'ai bien mes questions qui s'affiche avec la date puisque j'ai fait une requete custom dans le repository :

    public function findAllQuestionsByDate()
    {
        return $this->createQueryBuilder('q')
            ->innerJoin()
            ->orderBy('q.createdAt', 'DESC')
            ->getQuery()
            ->getResult();
    }


Mais je souhaite aussi afficher les Tags liés aux questions.
Si je laisse {{questions.tagName}} avec une boucle for j'ai une erreur

upload/1535727707-72266-erreur-twig-index.png

Auriez-vous une idée de comment je peux sortir de ce problème ? Je pense savoir d'où cela peut venir mais je ne trouve pas comment m'y prendre ?

Merci Smiley smile
Modérateur
Bonjour,


{#% for t in questions.tags %#}
  <div class="card-header justify-content {{ cycle(['list-even', 'list-odd', 'list-other'], q.id) }}">{{questions.tagName}}</div>
{#% endfor %#}


questions est une collection de questions...
donc il me semble:


{#% for t in q %#}
  <div class="card-header justify-content {{ cycle(['list-even', 'list-odd', 'list-other'], q.id) }}">{{t.tagName}}</div>
{#% endfor %#}
Meilleure solution
C'est tout à fait ça, c'est génial ! J'ai encore tendance à me tromper avec ça du coup je m’emmêle les pinceaux. Tout est encore très frais dans ma tête donc pas forcément à l'aise.
En tout cas merci beaucoup !
Il est possible que je bloque encore sur cet exercice. Donc toute aide sera la bienvenue à un moment donnée Smiley cligne Smiley smile
Hésite pas à mettre en "Résolu".. Smiley smile J'ai commencer à étudier ton problème.. je scroll un peu et la "Oh, c'est déjà résolu"....
Oui je suis désolée, je l'ai vu après que je pouvais mettre résolu au sujet.
Je débute sur le forum donc ça va rentrer Smiley cligne
Bonjour tout le monde,

Je début avec symfony et ça fais depuis le début de la journée je bug sur le même probleme que Virginia ...
Sauf qu'au moment de l'affichage au lieu d'avoir le tag de chaque questions (je prend l'exmple de Virgine comme ça c'est plus simple) j'ai la liste de tout les tags qui s'affiche pour chaque question ce qui n'est pas normal à mon avis.
Quelqu'un aurait une idée de là où pourrait venir mon soucis .. ?

Merci d'avance cordialement.