我的问题与学说的懒惰功能有关2。
假设我有这两个实体:
- 区域
- 场地
这是快速规格:
- 一个区域可以包含其他区域(子区域...)
- 一个场地仅位于1个区域
- 区域:: getfullname()应输出"父区域名称(如果有)>区域名称"
我的PHP实体是:
class Area extends AbstractEntity {
/**
* @ORMManyToOne(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 {
/**
* @ORMManyToOne(targetEntity="Area")
*/
private $area;
假设"巴黎"地区包含一个名为"中心"的子区域
如果我打电话:
$area = $repoArea->findByUrl("paris/center")
echo $area->getFullName();
// --> "Paris > Center"
到目前为止,一切都很好。
但是,现在可以说," Fouquet的"餐厅是巴黎中心的一个场所:
$venue = $repoVenue->findByName("Fouquet's");
echo $venue->getArea()->getFullName()
// --> " > Center"
母体区域名称( ->"巴黎")未输出...
$this->fullName = ($this->getParent() ? $this->getParent()->name . ' > ' : '') . $this->name;
但是,父级代理对象不是null。它只是不是初始化的。因此称属性为"名称"返回null。
看来"双"(或"多对一对一" ...)懒负荷失败。类似:
$venue->getArea()->get(Parent)Area()->name
使用学说时,属性绝不应公开。这将带领 以懒惰加载方式在学说中起作用的错误。
来源:学说的入门
基本上,您应该在Area
类中添加getName()
方法,并使用->getName()
代替->name
,因此学说可以拦截呼叫并加载代理对象的数据。; - )