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 个小时,我希望这对其他人有所帮助。
在 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 个小时,我希望这对其他人有所帮助。