Silverstripe 使用DataObjectManager调用两次onAfterWrite方法
我使用的dataobjectmanager在车主和汽车之间有很多关系(我不能使用manymanydataobjectmanager)。每当创建一辆新车时,我都会遍历owner的所有实例,并将其id与新车id一起添加到链接表中 我的问题是,执行此操作的代码在onafterwrite方法中,并且被调用了两次。我不知道为什么。我还注意到,对于我的三个所有者来说,它在链接表中创建行的方式很奇怪。前两个ID将按顺序排列,然后它将粘住一个ID。第1行,第2行,第4行,第3行 这是我的onAfterWrite方法Silverstripe 使用DataObjectManager调用两次onAfterWrite方法,silverstripe,Silverstripe,我使用的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()
- 选择OwnerID=$Owner->ID的所有车主记录
- 删除不在$Pages列表中的任何内容
- 从$Page列表中插入任何不在Owner\u Cars中的内容
如果可以的话,我还有一个建议,那就是试试SilverStripe 3。SilverStripe 3的GridField可以在开箱即用的情况下更有效地处理这类内容,您可能会发现在这一点上构建应用程序更容易。onAfterWrite()方法可能会被调用两次,因为
write()
会被调用两次。发生这种情况的最常见原因是:
- 一个write()恰好生成了ID
- 然后,在保存依赖该ID的相关记录时,会发生另一个write()
- 选择OwnerID=$Owner->ID的所有车主记录
- 删除不在$Pages列表中的任何内容
- 从$Page列表中插入任何不在Owner\u Cars中的内容
如果可以的话,我还有一个建议,那就是试试SilverStripe 3。SilverStripe 3的GridField可以在开箱即用的情况下更有效地处理这类内容,您可能会发现在这一点上构建应用程序更容易。不能使用manymanydataobjectmanager吗?这是一个技术限制,还是您只是不想使用它?我从未让dataobjectmanager处理SilverStripe中的多对多关系。我想这与“onBeforeWrite”是一样的,请参阅此线程以了解解释和解决方法:不能使用manymanydataobjectmanager?这是一个技术限制,还是您只是不想使用它?我从未让dataobjectmanager在SilverStripe中处理多对多关系。我想这与“onBeforeWrite”是一样的,请参阅此线程以了解解释和解决方法:谢谢你的回答Sam。我已经大致了解了你所说的,但谢谢你的回答。它澄清了我剩下的问题。谢谢你的回答,山姆。从那以后,我几乎了解了你说的话,但谢谢你的回答。它澄清了我剩下的问题。