1

私の問題は、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
4

1 に答える 1

0

Doctrine を使用するときは、プロパティを public にしないでください。これにより、Doctrine で遅延読み込みが機能する方法にバグが発生します。

出典: Doctrine のはじめに


基本的に、Doctrine が呼び出しをインターセプトして Proxy オブジェクトのデータをロードできるように、クラスにgetName()メソッドを追加して代わりに使用する必要があります。;-)Area->getName()->name

于 2012-10-20T16:10:39.597 に答える