私のオブジェクト間の関係が一貫していることを保証するのに問題があります。私はDoctrine 2を使用していますが、これはおそらく他の言語やORMマッパーにも当てはまります。オブジェクトの関係の一貫性を保証する(doctrine 2)
Doctrineによると、関係には所有側と逆側があります。双方向関係を使用する場合は、一貫性を確保する必要があります。基本的には、関係の片側が変更されたときに手動で相手側を更新する必要があります。 Foo hasMany Bar
ここ
私の例:意図したとおりに
class Foo
{
/** @OneToMany(targetEntity="Bar",mappedBy="foo") */
private $bars;
public function addBar($bar)
{
$this->bars[] = $bar;
// Ensure consistency
$bar->setFoo($this);
}
}
class Bar
{
/** @OneToMany(targetEntity="Foo",inversedBy="bars") */
private $foo;
public function setFoo($foo)
{
$this->foo = $foo;
// Ensure consistency
$foo->addBar($this);
}
}
は今、明らかに、上記のコードは動作しません。 Foo::addBar
またはBar::setFoo
が呼び出されると、無限ループになります。だから、どうすればはFoo
とBar
になるはずですか?中
ユーザー/バグ例ドクトリン2 「はじめに」ガイドは、単にだけsetFoo
にaddBar
に一貫性を保証していないことで問題を回避スカート。
私が遭遇している壁は、addBar
とsetFoo
の両方が公開関数でなければならない、または私は関連モデルから呼び出すことができないということです。しかし、これは、これらのオブジェクトを使用する開発者がいずれかの関数を使用して新しい関係を作成できることを意味します。
どうすれば解決できますか?どのように他の言語やマッパーがこれを解決するのですか?
いいえ。しかし、基本的に誰かが間違った(逆の)側から関係に追加するのを防ぐ方法はありませんか? –
私の知る限り - いいえ。あなたのリポジトリに、他のapprochを使用している人と比較して使うべきfindメソッドを持っているのであれば、ちょっと似た問題です。ドキュメントを提供することやそれを説明すること以外に、実際にそれを防ぐことはできません。 –