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