symfony - 未找到异常 id,转储显示带有 isInitialized false 的实体且所有属性为 null
问题描述
我有一个 Cours(它是法语课程)实体,并且这个实体有一个“prof”属性,它与 Prof(法语老师)实体是多方关系。这个 Prof 实体本身扩展了一个 Eleve(学生)实体(一个 prof 是一个具有更多属性和方法的 elve)。
我用夹具创建了一个教授和一个课程,只是为了测试我的应用程序。然后,在 CourseController 中,我尝试将我的课程和教授信息发送到视图。为此,我加载了我的课程,然后我尝试通过我的课程访问我的教授。
当我尝试显示课程信息时,一切都很好。但是当我尝试访问教授时,没有任何效果。我收到一个错误,告诉我 id 列不存在,当我尝试转储 prof 时,它告诉我 isInitialized 是假的,并且每个属性都是空的。
我发现其他存在类似问题的 stackoverflow(或其他论坛)主题,人们解释说 symfony 会延迟加载,并且不会以这种方式加载相关实体,它会变得更快。但是在我的情况下,提出的所有解决方案都不起作用或不是好的选择。
解决方案之一似乎是在我的多对一关系中将获取设置为渴望。但问题是 prof 本身有许多多对一或多对多或其他关系,并且每个实体都必须允许访问相关的实体(所以也很渴望获取),因此,每次我想要获得一个实体时,我'将加载整个数据库。我只想加载我需要的东西,这将在每个控制器和每个方法中发生变化。
提出的另一种解决方案是调用我的相关对象(在这种情况下为prof)的一些方法,告诉我们需要访问它的学说,这样学说加载它。但是这个结果再次出现异常(没有找到告诉 id 列)。
在课程控制器中:
/**
* @Route("/cours/{slug}", name="presentationCours")
*/
public function presentationCours(Cours $cours)
{
$prof = $cours->getProf();
// $prof->getLogin(); THIS result with exception
dump($prof); // THIS shows all null values
die();
return $this->render('cours/presentation.html.twig', [
"cours" => $cours,
"prof" => $prof
]);
}
注意:如果你想知道我如何在不告诉 symfony 在哪里找到它的情况下获得 $cours var,它可以通过路径中的 slug 找到它。它在 symfony 4 中是新的(不确定它是新的,但我认为)。我确信它有效,我做了很多次并且转储($cours)完美地工作。
树枝文件:
{% extends 'base.html.twig' %}
{% block title %}{{ cours.nom }}{% endblock %}
{% block body %}
<p>
{{ cours.nom }}
</p>
<p>
{{ cours.description }}
</p>
<p>
{{ prof.login }} {# THIS result with exception #}
</p>
{% endblock %}
Eleve 实体的一部分(作为 prof 父级的实体:prof extends eleve)
<?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\EleveRepository")
*/
class Eleve
{
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\Column(type="string", length=255)
*/
private $login;
...
}
教授实体的一部分:
<?php
namespace App\Entity;
use App\Entity\Eleve;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity(repositoryClass="App\Repository\ProfRepository")
*/
class Prof extends Eleve
{
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\Column(type="text")
*/
private $introduction;
/**
* @ORM\Column(type="text")
*/
private $description;
/**
* @ORM\OneToMany(targetEntity="App\Entity\Cours", mappedBy="prof")
*/
private $cours;
课程实体的一部分:
<?php
namespace App\Entity;
use Cocur\Slugify\Slugify;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\Collection;
use Doctrine\Common\Collections\ArrayCollection;
/**
* @ORM\Entity(repositoryClass="App\Repository\CoursRepository")
* @ORM\HasLifecycleCallbacks
*/
class Cours
{
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\ManyToOne(targetEntity="App\Entity\Prof", inversedBy="cours")
* @ORM\JoinColumn(nullable=false)
*/
private $prof;
在带有 phpmyadmin 的数据库中:
课程表的一部分:
教授表的一部分:
例外(没有转储):
转储(教授)结果:
感谢您的时间。
编辑
问题解决了 !正如 jeroen 所说,问题在于继承。
这是我为解决它所做的工作:
<?php
namespace App\Entity;
use App\Entity\Prof;
use App\Entity\Eleve;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\ORM\Mapping\InheritanceType;
use Doctrine\ORM\Mapping\DiscriminatorMap;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping\DiscriminatorColumn;
use Doctrine\Common\Collections\ArrayCollection;
/**
* @ORM\Entity(repositoryClass="App\Repository\EleveRepository")
* @InheritanceType("SINGLE_TABLE")
* @DiscriminatorColumn(name="discr", type="string")
* @DiscriminatorMap({"eleve" = "Eleve", "prof" = "Prof"})
*/
class Eleve
{
我添加了行继承类型、鉴别器列和鉴别器映射。这是因为我选择了类表继承,但是你可以选择映射超类解决方案,或者单表继承解决方案。
对于那些像我一样会在更改类之前进行迁移的人,我在添加类表继承时遇到了问题。之后 Doctrine 拒绝迁移,异常告诉我存在外键问题。我不确定这是不是好方法,但是我在 symfony (src > migrations) 中删除了我的迁移文件,我在 phpmyadmin 中删除了我的整个数据库,然后在 symfony 中,使用 CLI(命令行界面,ctrl +ù on windows 和mac上的ctrl + `(在键盘上输入的左侧),我做了:
- bin/控制台原则:数据库:创建
- bin/控制台制作:迁移
- bin/控制台原则:迁移:迁移
现在问题已经解决了。但同样,我真的不确定这是不是好方法,只是说它对我有用。
解决方案
推荐阅读
- java - Cactoos flatMap 类比
- ios - 使用领域时出现间歇性链接器和构建错误
- xslt - 如何在 TIBCO 的 Transform xml 活动的输出中获取与号“&”
- jquery - 更改点击功能上的图标
- visual-studio-code - Visual Studio 代码中的增量搜索快捷方式
- mysql - 为什么当我用 mysql 数据库调试我的应用程序胶子时,我的手机没有打开?
- amazon-web-services - 解读 AWS Glue 内存不足和指标
- python - Running session failed due to tensors datatype and shape Tensorflow
- c++ - OpenGL用鼠标移动顶点
- excel - 命令条代码在标准模块中有效,但在“ThisWorkbook”模块中无效