У меня проблема с обеспечением того, чтобы отношения между моими объектами оставались согласованными.Я использую Doctrine 2, но, вероятно, это применимо и к другим языкам и средствам отображения ORM.
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
, чтобы все работало как задумано?
Пример пользователя / ошибки в Doctrine 2 «Начало работы» Руководство просто обходит проблему, обеспечивая последовательность только в addBar
, а не в setFoo
.
Стена, с которой я сталкиваюсь, заключается в том, что и addBar
, и setFoo
должны быть публичными функциями.или я не могу позвонить им из родственной модели.Но это означает, что разработчики, использующие эти объекты, могут использовать любую функцию для создания новых отношений.
Как мне решить эту проблему?Как это решают другие языки и картостроители?