Symfony 访问实体内的父实体 class

Symfony Accessing to parent entity inside entity class

在 Symfony 5 中,我创建了 2 个与 ManyToOne 关系相关的实体:Project 是父项,Serie 是子项。

Project实体:

namespace App\Entity;

use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;

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

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

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\Project", inversedBy="series")
     * @ORM\JoinColumn(nullable=false)
     */
    private $project;

    [...]
}

Serie 实体:

namespace App\Entity;


use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;

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

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


    /**
     * @ORM\OneToMany(targetEntity="App\Entity\Serie", mappedBy="Project", orphanRemoval=true)
     */
    private $series;

    [...]
}

我没有在这里写下来,但是你也有每个 class.

的所有 getter 和 setter

我需要访问 Serie 实体中的 Project 实体。例如:通过在 Serie class.

中添加 getProjectName 方法来访问项目实体的名称 属性
    public function getProjectName()
    {
        return $this->project->getName();
    }

但这不起作用,因为未加载 Project 实体(仅加载 id)。如何在不在实体 class 中添加存储库或将任何参数传递给 getProjectName 方法的情况下获取此值? (也许是 Doctrine 注释...)。

在学说中,关系中的实体是 延迟加载的 ,这意味着,当您没有访问 $this->project(或引用的项目)上的任何内容时,它只会属于 Project^ 类型(注意 ^),它将有一个名为 __initialized__(或类似)的属性,其值为 false(通过 dump($this->project); 检查) .这意味着实体尚未加载。

延迟加载意味着,如果确实需要它就会加载它(从而减少数据库访问),在此之前,代理对象将取代实体。它将注册对它完成的所有调用,必要时加载实体并将所有调用转发给它。

因此,要加载延迟加载的实体,您只需调用 它的方法之一。所以 $this->project->getName() 应该已经很好地工作了。 (之后通过调用 dump($this->project); 进行验证)。

如果没有,那就是 missing/wrong/dysfunctional。

好的,谢谢 Jakumi。你是对的,在这方面,它工作正常。

为了完成您的解释,如果您想获取子元素,例如:

$series = $project->getSeries();

您将得到一个空的 table(foreach 循环不会获取任何项目)。这是因为 $series 是一个 Doctrine Collection。您需要使用 :

$series = $project->getSeries()->getValues();

拥有一个完整的数组。

我在这个主题上花了 2 个小时,我希望这对其他人有所帮助。