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
Silverstripe 使用DataObjectManager调用两次onAfterWrite方法_Silverstripe - Fatal编程技术网

Silverstripe 使用DataObjectManager调用两次onAfterWrite方法

Silverstripe 使用DataObjectManager调用两次onAfterWrite方法,silverstripe,Silverstripe,我使用的dataobjectmanager在车主和汽车之间有很多关系(我不能使用manymanydataobjectmanager)。每当创建一辆新车时,我都会遍历owner的所有实例,并将其id与新车id一起添加到链接表中 我的问题是,执行此操作的代码在onafterwrite方法中,并且被调用了两次。我不知道为什么。我还注意到,对于我的三个所有者来说,它在链接表中创建行的方式很奇怪。前两个ID将按顺序排列,然后它将粘住一个ID。第1行,第2行,第4行,第3行 这是我的onAfterWrite

我使用的dataobjectmanager在车主和汽车之间有很多关系(我不能使用manymanydataobjectmanager)。每当创建一辆新车时,我都会遍历owner的所有实例,并将其id与新车id一起添加到链接表中

我的问题是,执行此操作的代码在onafterwrite方法中,并且被调用了两次。我不知道为什么。我还注意到,对于我的三个所有者来说,它在链接表中创建行的方式很奇怪。前两个ID将按顺序排列,然后它将粘住一个ID。第1行,第2行,第4行,第3行

这是我的onAfterWrite方法

public function onAfterWrite() {

    if(Permission::check('ADMIN')){
        $Pages = DataObject::get('Owner');              

        foreach($Pages as $owner) {

        DB::query("INSERT INTO Owner_Cars (OwnerID, CarID) VALUES ('". $owner->ID . "', '" . $this->ID . "')");
        }
    }
    else {
        echo "Failure";
        return false;
    }
    return parent::onAfterWrite();
}
如果你能给我任何建议,我将不胜感激

谢谢

onAfterWrite()方法可能会被调用两次,因为
write()
会被调用两次。发生这种情况的最常见原因是:

  • 一个write()恰好生成了ID
  • 然后,在保存依赖该ID的相关记录时,会发生另一个write()
一般来说,我认为不能依赖于onAfterWrite()被调用一次:write()的设计应该使它可以被调用任意次数,并且只有在需要进行更改时才会真正影响数据库

您需要使代码调用必要的DELETE、INSERT和/或UPDATE语句与此兼容。例如,您可以:

  • 选择OwnerID=$Owner->ID的所有车主记录
  • 删除不在$Pages列表中的任何内容
  • 从$Page列表中插入任何不在Owner\u Cars中的内容

如果可以的话,我还有一个建议,那就是试试SilverStripe 3。SilverStripe 3的GridField可以在开箱即用的情况下更有效地处理这类内容,您可能会发现在这一点上构建应用程序更容易。

onAfterWrite()方法可能会被调用两次,因为
write()
会被调用两次。发生这种情况的最常见原因是:

  • 一个write()恰好生成了ID
  • 然后,在保存依赖该ID的相关记录时,会发生另一个write()
一般来说,我认为不能依赖于onAfterWrite()被调用一次:write()的设计应该使它可以被调用任意次数,并且只有在需要进行更改时才会真正影响数据库

您需要使代码调用必要的DELETE、INSERT和/或UPDATE语句与此兼容。例如,您可以:

  • 选择OwnerID=$Owner->ID的所有车主记录
  • 删除不在$Pages列表中的任何内容
  • 从$Page列表中插入任何不在Owner\u Cars中的内容


如果可以的话,我还有一个建议,那就是试试SilverStripe 3。SilverStripe 3的GridField可以在开箱即用的情况下更有效地处理这类内容,您可能会发现在这一点上构建应用程序更容易。

不能使用manymanydataobjectmanager吗?这是一个技术限制,还是您只是不想使用它?我从未让dataobjectmanager处理SilverStripe中的多对多关系。我想这与“onBeforeWrite”是一样的,请参阅此线程以了解解释和解决方法:不能使用manymanydataobjectmanager?这是一个技术限制,还是您只是不想使用它?我从未让dataobjectmanager在SilverStripe中处理多对多关系。我想这与“onBeforeWrite”是一样的,请参阅此线程以了解解释和解决方法:谢谢你的回答Sam。我已经大致了解了你所说的,但谢谢你的回答。它澄清了我剩下的问题。谢谢你的回答,山姆。从那以后,我几乎了解了你说的话,但谢谢你的回答。它澄清了我剩下的问题。