首页 > 解决方案 > 未找到异常 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 + `(在键盘上输入的左侧),我做了:

现在问题已经解决了。但同样,我真的不确定这是不是好方法,只是说它对我有用。

标签: symfonydoctrinesymfony4

解决方案


推荐阅读