私の問題は、Doctrine 2 の遅延読み込み機能に関連しています。
これらの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;
エリア「パリ」に「センター」という名前のサブエリアが含まれているとします。
私が電話した場合:
$area = $repoArea->findByUrl("paris/center")
echo $area->getFullName();
// --> "Paris > Center"
ここまでは順調ですね。
しかし、ここで、「フーケ」レストランがパリの中心部にある会場の 1 つであるとしましょう。
$venue = $repoVenue->findByName("Fouquet's");
echo $venue->getArea()->getFullName()
// --> " > Center"
親エリア名(→「パリ」)が出力されない…
$this->fullName = ($this->getParent() ? $this->getParent()->name . ' > ' : '') . $this->name;
ただし、親エリア プロキシ オブジェクトは NULL ではありません。初期化されていないだけです。そのため、プロパティ「name」を呼び出すと NULL が返されます。
「二重」(または「多対一の多対一」...)の遅延読み込みが失敗するようです。何かのようなもの:
$venue->getArea()->get(Parent)Area()->name