交响乐 5;无法访问连接的实体值

Symfony5; cant access joined entity values

在我的添加时间控制器中,我可以看到并访问集合中的变量 但是当我尝试在主控制器中访问它们时,我只得到一个空集合,请参见主控制器

我的 ProjectHours 实体

/**
 * Class ProjectHours
 * @ORM\Entity
 */
class ProjectHours
{

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


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


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


    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\Project", inversedBy="project_hours")
     * @ORM\JoinColumn(name="project_id", nullable=false, referencedColumnName="id", onDelete="CASCADE")
     */
    private $project;


    /**
     * @ORM\Column(type="dateinterval")
     */
    private $duration;


    public function addProjectHours(ProjectHours $ph)
    {
        $this->project_hours[] = $ph;
    }

    /**
     * @return Collection|ProjectHours[]
     */
    public function getProjectHours()
    {
        return $this->project_hours;
    }


我的项目实体


/**
 * Class Project
 * @ORM\Entity
 */
class Project
{


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


    /**
     * @ORM\Column(type="string")
     */
    private $name;


    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\User", inversedBy="projects")
     * @ORM\JoinColumn(name="user_id", nullable=false, referencedColumnName="id")
     */
    private $user;

    /**
     * @ORM\OneToMany(targetEntity="App\Entity\ProjectHours", mappedBy="project", cascade={"persist", "remove"})
     */
    private $project_hours;



    public function addProjectHours(ProjectHours $ph)
    {
        $this->project_hours[] = $ph;
    }

    /**
     * @return Collection|ProjectHours[]
     */
    public function getProjectHours()
    {
        return $this->project_hours;
    }


我的 addHours 控制器

  #[Route('projects/{project}/new', name: 'app_newHours')]
    public function index(Request $request, $project): Response
    {

        $em=$this->getDoctrine()->getManager();
        $project = str_replace('%20', ' ', $project);

        $hour_entry = new ProjectHours();

        $hour_entry->setTimestampStart(new \DateTime('NOW'));
        $hour_entry->setTimestampEnd(new \DateTime('NOW'));

        $pj = $em->getRepository(Project::class)->findOneBy(array('name'=> $project));
        $hour_entry->setProject($pj);

        $form = $this->createForm(AddHoursClassType::class, $hour_entry );
        $form->handleRequest($request);


        if($form->isSubmitted() && $form->isValid())
        {
            $start = $hour_entry->getTimestampStart();
            $end = $hour_entry->getTimestampEnd();

            if($end > $start)
            {
                $interval = $start->diff($end);

                $hour_entry->setDuration($interval);

                $pj->addProjectHours($hour_entry);


                //store to database
                $em->persist($hour_entry);
                $em->persist($pj);
                $em->flush();
                $this->addFlash('success', 'Hours added successfully!');
            }
            else
            {
                $this->addFlash('error', 'End time must be later than start time!');
            }
        }

最后在我的主控制器中

 /**
         * @Route("/projects", name="app_mainscreen")
         */
        public function Main()
        {
            $em = $this->getDoctrine()->getManager();
            $user = $this->getUser();
            $projects = $em->getRepository(Project::class)->findBy(array('user' => $user));
            $hourlist = $this->getHourList($projects, $em);

            dd($projects[0]->getProjectHours());


            return $this->render('home.html.twig', [
                'projectlist' => $projects,
                'hourlist' => $hourlist
            ]);
        }

如果有人能帮助我,将不胜感激!

这是因为在您访问它们(延迟加载)之前,该集合仅保留对实体的引用,如 #initialized: false 所示。由于您在访问集合的任何内容之前正在转储,因此它似乎是空的。此行为旨在在您可能不想访问集合的情况下提高性能,然后不需要获取相关实体。
出于调试目的,您可以通过使用内置方法 toArray:

将集合转换为数组来强制加载集合中的所有项目
dd($projects[0]->getProjectHours()->toArray());

通常,当您循环访问模板中的集合时,应加载单个项目(toArray 不是必需的)。

{% for project in projectlist %}
  Project {{ project.name }} hours:
  <ul>
  {% for hour in project.projectHours %}
    <li>
      Started: {{ hour.timestampStart|date('g:ia D, M jS, Y') }}<br>
      Ended: {{ hour.timestampEnd|date('g:ia D, M jS, Y') }}    
    </li>
  {% endfor %}
  </ul>
{% endfor %}