在cakephp中保存另一个模型的数据以及重定向问题

在cakephp中保存另一个模型的数据以及重定向问题,cakephp,model,save,Cakephp,Model,Save,当我在一个模型中保存数据时,我想在另一个模型中创建一些数据并保存。因为我,我最终决定使用afterSave在我的第二个模型中创建新的数据项。我不是在写博客应用程序,但使用博客类比,它相当于为添加的每个博客帖子自动创建一系列评论,并且在编辑帖子时,删除所有评论并重新添加新评论: class Post extends AppModel { function afterSave() { ClassRegistry::init('Comments')->deleteAll(

当我在一个模型中保存数据时,我想在另一个模型中创建一些数据并保存。因为我,我最终决定使用afterSave在我的第二个模型中创建新的数据项。我不是在写博客应用程序,但使用博客类比,它相当于为添加的每个博客帖子自动创建一系列评论,并且在编辑帖子时,删除所有评论并重新添加新评论:

class Post extends AppModel {
    function afterSave() {
        ClassRegistry::init('Comments')->deleteAll(array('Post.id' => $this->id));
        ClassRegistry::init('Comments')->saveAll($comments); // comments contains the comments to be added
    }
}
这很好,除了afterSave函数导致从控制器的添加/编辑操作到/posts/index的重定向被否决之外,我会被重定向回添加/编辑表单,如果我注释掉整个afterSave方法,重定向会按预期工作

如果你想知道为什么我没有将逻辑放在控制器中,我本来是这样做的,但我希望它既能用于添加和编辑操作,也能用于一次添加多篇文章的批量添加操作

我想我有两个问题:

有没有更好的方法来实现这一点 什么样的结果

我如何使重定向工作


感谢您阅读本文,如果我还没有解释清楚,我希望您可以利用您的想象力来了解我正在尝试做什么。

我认为您需要在afterSave函数的末尾包含return true。如果您不想将其放入控制器中,这似乎是一个不错的方法。尽管我会考虑您是否总是希望在每次保存后添加这些注释或其他注释,即使是单字段更新。

在其他人有相同问题的情况下,我最终发现了该设置

'atomic' => false
在中,解决了重定向的问题。我不知道为什么。

你做不到

<?php
function edit_post($id = null) {
    if (!$id && empty($this->data)) {
        // error...
    }       
    if (!empty($this->data)) {
        if ($this->Post->save($this->data)) {
            ClassRegistry::init('Comments')->deleteAll(array('Post.id' => $this->Post->id));
            ClassRegistry::init('Comments')->saveAll($comments); // comments contains the comments to be added
        } else {
            // error...
        }
    }       
    if (empty($this->data)) {
        $this->data = $this->Post->read(null, $id);
    }
}
?>

模型不是重定向的对象。发布您的控制器代码。我的应用程序中没有“注释”控制器-这可能是调用ClassRegistry::init'comments->saveAll方法时实际上没有重定向的原因,但当注释掉时重定向有效??感谢您的建议,但包含return true不会改变任何东西。我所有的数据库表都是InnoDBI最终可能会将逻辑放回控制器中,但目前我将其保留在这里描述的model afterSave函数中,并且一切正常。如果我将其移动到控制器,我可能会更改已接受的答案。我可以在控制器中执行此操作。我已对其进行了测试,它可以工作,但我宁愿将其放入模型中,原因有很多,包括避免添加/编辑/批量添加操作的代码重复。您也可以将其放入模型中,只需将$this->Post->save替换为$this->save并放入模型添加/编辑/批处理功能中即可。