正确删除相关模型

时间:2018-09-05 08:55:18

标签: laravel laravel-5.6

我的商店功能是

public function store(Request $request, Post $post)
{
    $comment = new Comment();
    $comment->fill($request->all());
    $post->comments()->save($comment);
}

我的破坏功能是

public function destroy(Post $post, Comment $comment)
{

}

我从文档(Inserting & Updating Related Models)获得的存储功能

那么通过Post模型删除评论的最佳做法是什么?

2 个答案:

答案 0 :(得分:1)

由于您的关系是hasManybelongsTo,因此您实际上不需要通过帖子 删除评论。该注释作为其自己的记录存在于其自己的表中,并且如果您遵守Laravel的命名约定,则该注释通过post_id与帖子相关联。

在这种情况下,只需删除delete方法即可删除评论:

public function destroy(Post $post, Comment $comment)
{
    $comment->delete();
}

如果您在SoftDeletes模型上使用Comment特征,则只需将deleted_at设置为当前时间戳。如果没有,它将从数据库中删除记录。如果您使用的是SoftDeletes,并且想从表中删除记录(而不仅仅是设置deleted_at),则可以使用forceDelete(请参见永久删除模型下的内容) ):

public function destroy(Post $post, Comment $comment)
{
    $comment->forceDelete();
}

如果您只想破坏评论和帖子之间的引用,则可以在评论对象上使用dissociate方法。这实际上将只是将post_id字段设置为null,并且不会从表中删除注释。

public function destroy(Post $post, Comment $comment)
{
    $comment->post()->dissociate();
    $comment->save();
}

如果您真的想使用这种关系来确保只能删除属于给定帖子的评论,则可以执行以下操作:

$post->comments()->whereKey($comment->id)->delete();

这将为查询添加一个额外的where,以确保评论中的post_id与帖子的ID相等。

作为参考,如果您具有多对多关系(双向belongsToMany),则需要删除数据透视表中的记录。为此,您可以使用detach或使用sync仅提供应保留的内容。

答案 1 :(得分:-1)

您可以尝试使用Laravel Observer,这是一个示例

要创建观察者,您可以

php artisan make:observer PostObserver

它将创建一个不错的样板。

class PostObserver
{

    public function deleting(Post $post){

        $comments =  $post->comments;
        $comments->delete();
    }

}

在您的AppServiceProvider.php中

Post::observe(PostObserver);

它将在删除帖子之前删除相关模型。