Doctrine orm 原则2-多对一延迟加载中的多对一失败

Doctrine orm 原则2-多对一延迟加载中的多对一失败,doctrine-orm,lazy-loading,Doctrine Orm,Lazy Loading,我的问题与条令2的延迟加载功能有关 假设我有两个实体: 区域 地点 以下是快速规格: 一个区域可以包含其他区域(子区域…) 场地仅位于1个区域内 Area::getFullName()应输出“父区域名称(如果有)>区域名称” 我的PHP实体是: class Area extends AbstractEntity { /** * @ORM\ManyToOne(targetEntity="Area", inversedBy="children") */ private $parent;

我的问题与条令2的延迟加载功能有关

假设我有两个实体:

  • 区域
  • 地点
以下是快速规格:

  • 一个区域可以包含其他区域(子区域…)
  • 场地仅位于1个区域内
  • Area::getFullName()应输出“父区域名称(如果有)>区域名称”
我的PHP实体是:

class Area extends AbstractEntity {
/**
 * @ORM\ManyToOne(targetEntity="Area", inversedBy="children")
 */
private $parent;

public function getFullName() {
    if (!isset($this->fullName)) {
        $this->fullName = ($this->getParent() ? $this->getParent()->name . ' > ' : '') . $this->name;
    }
    return $this->fullName;
}

class Venue extends AbstractEntity {

/** 
 * @ORM\ManyToOne(targetEntity="Area")
 */
private $area;
假设“巴黎”区域包含一个名为“中心”的分区

如果我打电话:

$area = $repoArea->findByUrl("paris/center")
echo $area->getFullName();
// --> "Paris > Center"
到目前为止,一切顺利

但现在让我们假设,“Fouquet’s”餐厅位于巴黎市中心:

$venue = $repoVenue->findByName("Fouquet's");
echo $venue->getArea()->getFullName()
// --> " > Center"
父区域名称(->“Paris”)未输出

$this->fullName = ($this->getParent() ? $this->getParent()->name . ' > ' : '') . $this->name;
但父区域代理对象不为NULL。它只是没有初始化。因此,调用属性“name”返回NULL

似乎“double”(或“多对一中的多对一”)延迟加载失败了。比如:

$venue->getArea()->get(Parent)Area()->name
在使用学说时,财产不应公开。这将导致 在条令中,延迟加载的工作方式存在缺陷

来源:



基本上,您应该将
getName()
方法添加到
区域
类中,并使用
->getName()
而不是
->name
,以便条令可以拦截调用并加载代理对象的数据。;-)

哦,还有,这是否意味着我必须为所有(
受保护的
私有的
)属性实现getter和setter?谢谢“这是否意味着我必须为我所有的(受保护的,私有的)文件实现getter和setter”-是的,如果您想使用条令的默认延迟加载。但是您可以重新定义代理,并使它们以另一种方式工作。