0

我在 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模型中?

4

1 回答 1

2

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

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

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

“级联”意味着如果您删除一个对象,删除将“级联”到相关对象,也将其删除。但仅当您删除关系中的“父级”时,而不是在您取消设置时(不会删除任何内容)。

于 2013-07-19T19:53:51.687 回答