Fuelphp保存删除关系,Observer调用before_update但不调用before_delete

时间:2013-07-15 23:31:41

标签: orm fuelphp

我有像这样的has_many关系的观察者:

Post has_many Comments

Comments已激活以下Observer

class Observer_Comments
{
    public function before_delete($model)
    {
        Log::info("Deleted a comment");
    }
    public function before_update($model)
    {
        Log::info("Updated a comment");
    }
}

当我像这样更新我的Post模型时:

$post = Post::find(1)->related('comments);
unset($post->comments[1]);
$post->save();

我的日志未显示任何活动。 Comment已删除,Post已正确更新,包括运行任何观察员。

当我明确删除评论时:

$comment = Comment::find(1);
$comment->delete();

然后日志显示我的期望:

INFO --> Deleted a Comment

我必须使用cascade设置吗?


更新

我在Model::save()

中看到了这段代码
1127    if (method_exists($rel, 'delete_related'))
1128    {
1129        $rel->delete_related($this);
1130    }

是否需要将delete_related方法添加到我的PostComments模型中?

1 个答案:

答案 0 :(得分:2)

Unset()不会删除相关对象,它会取消两者之间的关系。

如果是多个,这也意味着连接两者的联结表中的记录将被删除,在其他关系中,外键将被重置为NULL。

两个操作都不会改变对象的数据,因此不会在对象上触发UPDATE,因此不会调用观察者。

“cascade”表示如果删除对象,删除将“级联”到相关对象,也删除它。但是,只有当您删除关系中的“父”时,才会删除它(不删除任何内容)。