1

我的问题与 Doctrine 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;

假设“Paris”区域包含一个名为“Center”的子区域

如果我打电话:

$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。它只是没有初始化。因此调用属性“名称”返回 NULL。

似乎“双重”(或“多对一的多对一”......)延迟加载失败。就像是:

$venue->getArea()->get(Parent)Area()->name
4

1 回答 1

0

使用 Doctrine 时,属性永远不应该是公开的。这将导致延迟加载在 Doctrine 中的工作方式出现错误。

资料来源: 教义入门


基本上,您应该getName()向您的类添加一个方法Area并使用->getName(),而不是->name这样 Doctrine 可以拦截调用并加载代理对象的数据。;-)

于 2012-10-20T16:10:39.597 回答