doctrineの遅延読み込みメカニズムを処理する正しい方法について質問があります。@ManyToOneを介して別のエンティティを参照するエンティティがあります。
class Entity {
...
/**
* @ManyToOne(targetEntity="AnotherEntity")
* @JoinColumn(name="anotherEntityId", referencedColumnName="id")
*/
protected $anotherEntity;
...
}
class AnotherEntity {
/**
* @var integer $id
* @Column(name="id", type="integer", nullable=false)
* @Id
* @GeneratedValue(strategy="IDENTITY")
*/
private $id;
/**
* @var string $someValue
* @Column(name="someValue", type="string")
*/
private $someValue;
...
}
Doctrineは、ゲッターに遅延読み込みを実装するAnotherEntityのプロキシを生成するようになりました。
public function getSomeValue()
{
$this->__load();
return parent::getSomeValue();
}
これで、AnotherEntityの参照対応物を持たないEntityのインスタンスがいくつかある場合($ anotherEntityIdは0またはnull)。次に、doctrineはAnotherEntityの1つのnull-Objectを生成し、すべてのEntityオブジェクトの$anotherEntity変数がそれを指すようにします。遅延読み込みが必要なため、nullオブジェクトは初期化されていません。これを行うと、EntityNotFoundExceptionが発生します。
$entiy->getAnotherEntity()->getSomeValue();
それは素晴らしいことです!アクセスするAnotherEntityがデータベースに存在しないため、この例外が発生します。しかし、2番目のエンティティ(およびその後の他のすべて)で同じことを行うと、この例外は発生しません。これらはすべて、AnotherEntityの同じインスタンスを指しており、教義は最初の呼び出しで初期化されたものとしてマークしているためです。したがって、論理的には存在しないが例外は発生しないオブジェクトにアクセスしています。getSomeValue()から初期化されていない変数(空の文字列など)を取得するだけです。
空の値を受け入れるだけでなく、オブジェクトが存在しないことをアプリケーションに認識させる方法を知っていますか?