交响乐 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 %}
在我的添加时间控制器中,我可以看到并访问集合中的变量 但是当我尝试在主控制器中访问它们时,我只得到一个空集合,请参见主控制器
我的 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 %}