Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/238.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 确保对象关系的一致性(原则2)_Php_Oop_Entity Relationship_Doctrine Orm - Fatal编程技术网

Php 确保对象关系的一致性(原则2)

Php 确保对象关系的一致性(原则2),php,oop,entity-relationship,doctrine-orm,Php,Oop,Entity Relationship,Doctrine Orm,我在确保对象之间的关系保持一致方面遇到了问题。我使用的是条令2,但这可能也适用于其他语言和ORM映射器 教义说,关系有拥有的一面和相反的一面。如果您使用双向关系,那么您需要自己确保一致性。基本上,这意味着,当关系的一方发生变化时,您需要手动更新另一方 下面是我的例子,其中Foo有很多条: 现在很明显,上面的代码将无法按预期工作。当调用Foo::addBar或Bar::setFoo时,它将下降到一个无限循环中。那么,应该如何实现Foo和Bar以使其按设计工作呢 《条令2入门指南》中的用户/错误示例

我在确保对象之间的关系保持一致方面遇到了问题。我使用的是条令2,但这可能也适用于其他语言和ORM映射器

教义说,关系有拥有的一面和相反的一面。如果您使用双向关系,那么您需要自己确保一致性。基本上,这意味着,当关系的一方发生变化时,您需要手动更新另一方

下面是我的例子,其中Foo有很多条:

现在很明显,上面的代码将无法按预期工作。当调用Foo::addBar或Bar::setFoo时,它将下降到一个无限循环中。那么,应该如何实现Foo和Bar以使其按设计工作呢

《条令2入门指南》中的用户/错误示例仅通过确保addBar中的一致性而不是setFoo中的一致性来绕过这个问题

我遇到的问题是addBar和setFoo都必须是公共函数,否则我无法从相关模型调用它们。但这意味着使用这些对象的开发人员可以使用任何一个函数来创建新的关系


我如何解决这个问题?其他语言和映射器是如何解决这个问题的?

我不知道其他映射器或类似的映射器是如何解决这个问题的,但基本上在原则2中

当他们在手册中谈到拥有方时,他们指的是您的代码应该始终用来关联对象的实体

这主要是一个语义决定:例如,如果您有汽车和轮胎,那么将轮胎添加到汽车$car->addTire$tire中是有意义的;并且汽车未添加到轮胎$tire->setCar$car

因此,拥有实体应该做的是确保关系的一致性。非拥有方应该只设置关联属性


所以是的,如果代码错误地使用了非拥有方,那么关系可能会不一致。但是,这只是脚本执行期间的一个问题。即使您没有在两端设置关系,它也会正确地存储在数据库中,因此下次提取数据时,它将以一致的方式在实体之间设置。

我不知道其他映射器或类似的映射器是如何解决这一问题的,但基本上在原则2中

当他们在手册中谈到拥有方时,他们指的是您的代码应该始终用来关联对象的实体

这主要是一个语义决定:例如,如果您有汽车和轮胎,那么将轮胎添加到汽车$car->addTire$tire中是有意义的;并且汽车未添加到轮胎$tire->setCar$car

因此,拥有实体应该做的是确保关系的一致性。非拥有方应该只设置关联属性


所以是的,如果代码错误地使用了非拥有方,那么关系可能会不一致。但是,这只是脚本执行期间的一个问题。即使不在两端设置关系,它也会正确地存储在数据库中,因此下次提取数据时,它会以一致的方式在实体之间设置。

这是我目前的方法。只是加了一些支票

class Foo
{
    /** @OneToMany(targetEntity="Bar",mappedBy="foo") */
    private $bars;

    public function addBar($bar)
    {
        if (!$this->bars->contain($bar)) {
            $this->bars[] = $bar;
            $bar->setFoo($this);
        }
    }
}

class Bar
{
    /** @OneToMany(targetEntity="Foo",inversedBy="bars") */
    private $foo;

    public function setFoo($foo)
    {
        if ($this->foo !== $foo) {
            $this->foo = $foo;
            $foo->addBar($this);
        }
    }
}

这是我目前的做法。只是加了一些支票

class Foo
{
    /** @OneToMany(targetEntity="Bar",mappedBy="foo") */
    private $bars;

    public function addBar($bar)
    {
        if (!$this->bars->contain($bar)) {
            $this->bars[] = $bar;
            $bar->setFoo($this);
        }
    }
}

class Bar
{
    /** @OneToMany(targetEntity="Foo",inversedBy="bars") */
    private $foo;

    public function setFoo($foo)
    {
        if ($this->foo !== $foo) {
            $this->foo = $foo;
            $foo->addBar($this);
        }
    }
}

可以但基本上没有办法阻止某人从错误的反向方添加到关系中?据我所知-没有。如果说你的存储库中有一个应该使用的finder方法,与使用其他方法的人相比,这有点类似。除了提供文档之类的解释之外,真的不能阻止它。好的。但基本上没有办法阻止某人从错误的反向方添加到关系中?据我所知-没有。如果说你的存储库中有一个应该使用的finder方法,与使用其他方法的人相比,这有点类似。除了提供文档之类的解释之外,不能真正阻止它。