我的问题与Doctrine 2的延迟加载功能有关。
假设我有这两个实体:
以下是快速规格:
我的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。
似乎“双”(或“多对一”多对一“......)延迟加载失败。类似的东西:
$venue->getArea()->get(Parent)Area()->name
答案 0 :(得分:0)
使用Doctrine时,属性永远不应公开。这将导致 延迟加载在Doctrine中的工作方式。
来源: Doctrine's Getting Started
基本上,您应该在getName()
课程中添加Area
方法并使用->getName()
代替->name
,以便Doctrine可以拦截调用并加载代理对象&#39 ; s数据。 ; - )