TWIG PersistentCollection не удалось преобразовать в строку: вывод данных в таблицу из OneToMany - сущность ManyToOne - PullRequest
0 голосов
/ 03 мая 2019

Я пытаюсь отобразить данные каждого совпадения в таблице, подобной этой:

img1 | name1 | score1 | score2 | name2 | img2 | date | statut_id

Вот как я бы это сделал в sql:

SELECT j1.image AS img1, j1.name AS name1, s1.score AS score1, s2.score AS score2, j2.name AS name2, j2.image AS img2, m.date AS date, m.statut_id FROM jouster j1, jouster j2, matchs m, score s1, score s2 WHERE j1.id = s1.jouster_id AND m.id = s1.matchs_id AND j2.id = s2.jouster_id AND m.id = s2.matchs_id AND m.jouster1_id = j1.id AND m.jouster2_id = j2.id

Я хочусделать это с помощью «пути Symfony», но я к этому не привык

У меня проблема с оценками.Когда я пытаюсь получить доступ к счету каждого соперника, я получаю эту ошибку:

Возникла исключительная ситуация во время рендеринга шаблона ("Catchable Fatal Error: Объект класса Doctrine \ ORM \ PersistentCollectionневозможно преобразовать в строку ").

match.html.twig

{%  for match in matchs %}
    {{match.jouster1.image}}
    {{match.jouster1.name}}
    {{match.jouster1.scores}}
    -
    {{match.jouster2.scores}}
    {{match.jouster2.name}}
    {{match.jouster2.image}}
    {{match.date | date('Y-m-d H:i:s') }}

    <br>
{% endfor %}

MatchController.php

 /**
 * @Route("/match", name="match")
 */
public function match() {
    $matchs = $this->getDoctrine()->getRepository(Matchs::class)->findAll();

    return $this->render('page/match.html.twig', [
        'matchs' => $matchs
        ]);
}

Matchs.php

class Matchs {
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

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

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\Jouster", inversedBy="jouster2")
     * @ORM\JoinColumn(nullable=false)
     */
    private $jouster1;

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\Jouster", inversedBy="matchAsJouster2")
     * @ORM\JoinColumn(nullable=false)
     */
    private $jouster2;

    /**
     * @ORM\OneToMany(targetEntity="App\Entity\Score", mappedBy="matchs", orphanRemoval=true)
     */
    private $scores;

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\Statut", inversedBy="matchs")
     * @ORM\JoinColumn(nullable=false)
     */
    private $statut;

    *************************
    *** getters & setters ***
    *************************

    /**
     * @return Collection|Score[]
     */
    public function getScores(): Collection
    {
        return $this->scores;
    }

    public function addScore(Score $score): self
    {
        if (!$this->scores->contains($score)) {
            $this->scores[] = $score;
            $score->setMatchs($this);
        }

        return $this;
    }

Score.php

class Score
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\Column(type="smallint", nullable=true)
     */
    private $score;

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\Jouster", inversedBy="scores")
     * @ORM\JoinColumn(nullable=false)
     */
    private $jouster;

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\Matchs", inversedBy="scores")
     * @ORM\JoinColumn(nullable=false)
     */
    private $matchs;

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

    public function getScore(): ?int
    {
        return $this->score;
    }

    public function setScore(int $score): self
    {
        $this->score = $score;

        return $this;
    }

    public function getJouster(): ?Jouster
    {
        return $this->jouster;
    }

    public function setJouster(?Jouster $jouster): self
    {
        $this->jouster = $jouster;

        return $this;
    }

    public function getMatchs(): ?Matchs
    {
        return $this->matchs;
    }

    public function setMatchs(?Matchs $matchs): self
    {
        $this->matchs = $matchs;

        return $this;
    }
}

Jouster.php

    /**
 * @return Collection|Score[]
 */
public function getScores(): Collection
{
    return $this->scores;
}

public function addScore(Score $score): self
{
    if (!$this->scores->contains($score)) {
        $this->scores[] = $score;
        $score->setJouster($this);
    }

    return $this;
}

public function removeScore(Score $score): self
{
    if ($this->scores->contains($score)) {
        $this->scores->removeElement($score);
        // set the owning side to null (unless already changed)
        if ($score->getJouster() === $this) {
            $score->setJouster(null);
        }
    }

    return $this;
}

РЕДАКТИРОВАТЬ: Мне пришлось сделать цикл для отображения результатов матчей.

{%  for match in matchs %}
    {{match.jouster1.image}}
    {{match.jouster1.name}}

    {% for score in match.scores%}
    {{score.score}}
    {% endfor %}

    {{match.jouster2.name}}
    {{match.jouster2.image}}
    {{match.date | date('Y-m-d H:i:s') }}

1 Ответ

0 голосов
/ 03 мая 2019

как DarkBee указано в его комментарии.

Ошибка четко объяснена в самом сообщении об ошибке:

PersistentCollection не удалось преобразовать в строку

То есть, у вас была попытка вывести что-то из ветки, что на самом деле было не 1 вещью, а набором вещей. (Результаты в вашем случае)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...