Symfony - Ключ «skill» для массива с ключами «0, 1» не существует - PullRequest
0 голосов
/ 27 февраля 2019

Я пытаюсь отобразить все связанные свойства моей сущности присоединения в ветке.

Вот мои 3 сущности:

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

    /**
     * @ORM\OneToMany(targetEntity="App\Entity\Skill", mappedBy="jointure")
     */
    private $skills;

    /**
     * @ORM\OneToMany(targetEntity="App\Entity\Answer", mappedBy="jointure")
     */
    private $answers;

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

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

    /**
     * @return Collection|Skill[]
     */
    public function getSkills(): Collection
    {
        return $this->skills;
    }

    public function addSkill(Skill $skill): self
    {
        if (!$this->skills->contains($skill)) {
            $this->skills[] = $skill;
            $skill->setJointure($this);
        }

        return $this;
    }

    public function removeSkill(Skill $skill): self
    {
        if ($this->skills->contains($skill)) {
            $this->skills->removeElement($skill);
            // set the owning side to null (unless already changed)
            if ($skill->getJointure() === $this) {
                $skill->setJointure(null);
            }
        }

        return $this;
    }

    /**
     * @return Collection|Answer[]
     */
    public function getAnswers(): Collection
    {
        return $this->answers;
    }

    public function addAnswer(Answer $answer): self
    {
        if (!$this->answers->contains($answer)) {
            $this->answers[] = $answer;
            $answer->setJointure($this);
        }

        return $this;
    }

    public function removeAnswer(Answer $answer): self
    {
        if ($this->answers->contains($answer)) {
            $this->answers->removeElement($answer);
            // set the owning side to null (unless already changed)
            if ($answer->getJointure() === $this) {
                $answer->setJointure(null);
            }
        }

        return $this;
    }
}

Сущность умения с ManyToOne => Отношение присоединения:

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

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

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\Jointure", inversedBy="skills")
     * @ORM\JoinColumn(nullable=false)
     */
    private $jointure;

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

    public function getLabel(): ?string
    {
        return $this->label;
    }

    public function setLabel(string $label): self
    {
        $this->label = $label;

        return $this;
    }

    public function getJointure(): ?Jointure
    {
        return $this->jointure;
    }

    public function setJointure(?Jointure $jointure): self
    {
        $this->jointure = $jointure;

        return $this;
    }
}

Моя сущность Ответ тот же, что и у Навыка со свойством UserEmail.

Итак, в моем контроллере:

class HomeController extends AbstractController
{

    /**
     * @var JointureRepository
     */

    public function __construct(JointureRepository $repository, ObjectManager $em)
    {
        $this->repository = $repository;
        $this->em = $em;
    }

    /**
     * @Route("/", name="home")
     */
    public function index()
    {
        $JointureRepository = $this->getDoctrine()->getRepository(Jointure::class);
        $jointure = $JointureRepository->findAll();

        foreach($jointure as $jointures){
            $skills = $jointures->getSkills();
            $answers = $jointures->getAnswers();
        }
        $this->em->flush();

        return $this->render('pages/home.html.twig', [
            'controller_name' => 'HomeController',
            'jointure' => $jointure,
            'skills' => $skills,
            'answers' => $answers,
        ]);
    }
}

Когда я пытаюсь отобразить их в ветке:

{% for jointures in jointure.skills %}   
   {{jointures.label}}   
{% endfor %}

У меня следующая ошибка: Ключа «навыков» для массива с ключами «0, 1» не существует. В строке: {% для соединений в соединении.навыки%}

Если я сделаю:

{% for skill in skills %}
{{skill.id}}
{% endfor %}

3,4 появляется, но не 1,2, связанные с Jointure с id = 0 .. Не могли бы вы помочь мне, пожалуйста?

1 Ответ

0 голосов
/ 27 февраля 2019

Вы вывели вывод этой строки?

$jointure = $JointureRepository->findAll();

Если бы вы это сделали, вы бы увидели, что $jointure - это не один объект этого класса, а массив.

Вы даже использовали его в качестве массива в коде вашего контроллера:

foreach($jointure as $jointures){
    $skills = $jointures->getSkills();
    $answers = $jointures->getAnswers();
}

Вы используете массив, так как он будет единственным объектом в ветке, это ваша проблема.Вам нужно либо пройти через массив, чтобы получить навыки, либо вам нужно получить одно присоединение, чтобы использовать его по своему усмотрению.

{% for object in jointure %}
    {% for jointures in object.skills %}   
        {{jointures.label}}   
    {% endfor %}
{% endfor %}

В качестве базовой заметки взгляните наВаше именование переменных.Они вводят в заблуждение и не представляют значение, которое оно содержит.

$arrJointures = $JointureRepository->findAll();

$arrJointures будет подходящей переменной, поскольку она содержит массив соединений.Кроме того, с этим именем вы должны увидеть, что этот код не работает.

{% for jointures in arrJointures.skills %}   
   {{jointures.label}}   
{% endfor %}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...