学说2-多一对一的懒惰加载失败



我的问题与学说的懒惰功能有关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,因此学说可以拦截呼叫并加载代理对象的数据。; - )

相关内容

  • 没有找到相关文章

最新更新